好吧,不可否认,我的正则表达式技巧相当糟糕(我使用正则表达式cheatsheet构建它),并且在大多数情况下,这很有效,但是单个字符会让我感到沮丧。如果我将q w e r t y
粘贴到文本框中,我希望返回q,w,e,r,t,y,
,但它返回的是q,ue,rt,y
。
$("#niftyInput").bind('paste', function(e) {
var str = this.value.replace(/(\w)[\s,]+(\w?)/g, '$1,$2').replace(/[^a-zA-Z0-9-,]/g, '');
if (str!=this.value) this.value = str;
});
小提琴:http://jsfiddle.net/crunchfactory/435dc37o/
非常感谢!
答案 0 :(得分:1)
要理解更大的背景有点难,但为什么不是
$("#niftyInput").bind('paste', function(e) {
var str = this.value.replace(/[\s,]+/g, ',').replace(/[^a-zA-Z0-9-,]/g, '');
if (str!=this.value) this.value = str;
});
或
$("#niftyInput").bind('paste', function(e) {
this.value = this.value.replace(/[\s,]+/g, ',').replace(/[^a-zA-Z0-9-,]/g, '');
});
...但这与正则表达式无关。
答案 1 :(得分:0)
这是你的正则表达式所做的:
(\w) [\s,]+ (\w?) one character at least one whitespace or comma one or zero characters
当你的输入框中有q w e r t y
之类的内容时,以下是它的捕获方式:
'q'
是一个单词字符,与(\w)
匹配,因此'q'
存储在$1
中
' '
是一个空格,匹配[\s,]+
,继续进行
'w'
是一个单词字符,与(\w?)
匹配,因此'w'
存储在$2
中,匹配结束。
这就是q w e r t y
成对返回多个匹配(q,w)(e,r)(t,y)的原因,后者变为q,ue,rt,y
。
有很多方法可以做你真正想要的事情。由于默认情况下正则表达式是贪婪的并且将匹配尽可能多的字符,因此您可以这样做:
(\w+)[\s,]*
(\w+)
将捕获可能最长的单词字符序列
[\s,]*
然后会将其后的任何空格和逗号视为“匹配”的一部分,但不会将其视为$1
捕获的一部分。
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以使用以下代码,
替换空格:
$("#niftyInput").bind('paste', function(e) {
var str = this.value.replace(/\s+/g, ',').replace(/[^a-zA-Z0-9-,]/g, '');
if (str!=this.value) this.value = str;
});
<强> Working demo 强>