正则表达式在第一个字符后强制单个空格

如何在第一个字符后强制使用空格作为用户类型。 我只需要在第一个字符后面只有一个空格(在第一个字符之前不允许空格)。 在第一个字符和空格之后,最多可以有40个字符。

到目前为止我发现了这个,但不符合我的需要

$('.singleSpace').keyup(function() { var foo = $(this).val().split(" ").join(""); // remove hyphens if (foo.length > 0) { foo = foo.match(new RegExp('.{1}', 'g')).join(" "); } $(this).val(foo); }); 

样品

我不知道你为什么要这样做,但删除空格你可以使用这个:

 var str = $(this).val().replace(" ", ""); 

并在第一个字符后添加一个空格:

 var str = $(this).replace("^(.)(.*)$", "$1 $2"); 

你需要正则表达式吗?

 $('.singleSpace').keyup(function() { var $el = $(this); var val = $el.val(); if (val.length === 1) { $el.val(val + ' '); } }); 

完成var以处理光标位置

 var val=""; $('.singleSpace').keyup(function() { var ele = $(this)[0]; var foo = ele.value; if(val==foo){return false} var startPos = ele.selectionStart; var endPos = ele.selectionEnd; if(event.keyCode==8){ var diff=endPos-startPos; startPos-=diff; endPos-=diff; } foo = foo.replace(new RegExp('( )','g'),''); foo = foo.replace(new RegExp('^ *(.) *(.*?)'),'$1 $2'); val=foo; ele.value=foo; ele.selectionStart=startPos; ele.selectionEnd=endPos; }); 

这是你想要的regExp: *(.) *(.*?) ,你想使用.replace不匹配

演示

您可以使用此代码:

 $('.singleSpace').keyup(function() { var foo = $(this).val().replace(/^( *)([^ ] *)(.*)/g, function(_,b,c,d){ return $.trim(c) + ' ' + d.replace(/ /g, '').slice(0,40); }) $(this).val(foo) }); 

唯一的问题是光标位置。 如果在光标不在末尾时键入,光标将始终返回结束。

亲眼看看: http : //jsfiddle.net/S3gJL/2/

我建议你把这个function放在模糊事件中,但这可能很烦人。

您的要求并不简单。 有很多变化,用户可以复制粘贴,选择和删除。 很难防止一切。

上面提供的代码阻止了很多迂回(只有不阻止的是右键单击粘贴,也许是其他我不想到的东西 ),但是上面提到的成本。 您可能想要搜索插件或雇用某人来开发一个好的系统。


编辑1

删除第一个之后写入空间的授权。


编辑2

对于光标位置,此处修复:

 $('.singleSpace').keyup(function() { var foo = this.value.replace(/^( *)([^ ] *)(.*)/g, function(a,b,c,d,e){ return $.trim(c) + ' ' + d.replace(/ /g, '').slice(0,40); }) var carretPos = doGetCaretPosition(this) carretPos += foo.length - this.value.length this.value = foo; setSelectionRange(this, carretPos, carretPos) }); //Code taken from // http://stackoverflow.com/questions/17858174/set-cursor-to-specific-position-on-specific-line-in-a-textarea function setSelectionRange(input, selectionStart, selectionEnd) { if (input.setSelectionRange) { input.focus(); input.setSelectionRange(selectionStart, selectionEnd); } else if (input.createTextRange) { var range = input.createTextRange(); range.collapse(true); range.moveEnd('character', selectionEnd); range.moveStart('character', selectionStart); range.select(); } } //Code taken from // http://stackoverflow.com/questions/2897155/get-cursor-position-in-characters-within-a-text-input-field function doGetCaretPosition (oField) { // Initialize var iCaretPos = 0; // IE Support if (document.selection) { // Set focus on the element oField.focus (); // To get cursor position, get empty selection range var oSel = document.selection.createRange (); // Move selection start to 0 position oSel.moveStart ('character', -oField.value.length); // The caret position is selection length iCaretPos = oSel.text.length; } // Firefox support else if (oField.selectionStart || oField.selectionStart == '0') iCaretPos = oField.selectionStart; // Return results return (iCaretPos); } 

小提琴