2011-10-24 50 views
1

我刚注意到一个很奇怪的行为。为什么简单的空间会打破所有的测试?Javascript,正则表达式和{n,m}

rePattern = /^([a-z]+[-_]?){2,}[a-z]$/; 
var test = new Array("jhgfg_hfh-g", "jhg-fg_hfhg", "jhg_fg_hfhg", "jhg_fg_hfhg", "jhg_fghfhg"); 
for (var i = 0; i < test.length ; i++) { 
    x = test[i]; 
    alert(i + ' : ' + x + ' : ' + rePattern.test(x)); 
} 

如果我改变了上面

// notice {2,} => {2, } with an extra space before } 
rePattern = /^([a-z]+[-_]?){2, }[a-z]$/; 

那么一切都变得false ...

感谢ü

+9

由于额外的空间,很明显。正则表达式的语法是严格的,你不能添加随机空白,并期望它会被忽略。 '{2,}'将匹配文字'{2,}'。 – duri

+3

@duri你的评论就是答案,你为什么不把它发布为答案? – stema

+0

好的,对不起,我确定它没问题..只是在Python中测试它,你也在那里... – lctv31

回答

4

OK,只是在这里有一个公认的答案:这是因为额外的空间。正则表达式的语法是严格的,你不能添加随机空白,并期望它会被忽略。 {2, }将匹配文字{2, }

/^x{2, }$/.test('x{2, }') === true 
+0

+1我认为大多数人不知道'{}'括号是字面匹配只要它们不是量词的一部分。 – stema

0

你的正则表达式一点儿也不工作,当你添加一个空格在开始或测试值的结束,因为你使用正则表达式delemiters ^和$

  • ^说,模式捕捉到字符串
  • $开始说,模式捕捉到字符串

结束如果将二者结合起来d elimiters,正则表达式将对包括空格在内的所有字符做出反应。

所以使用下面的正则表达式来捕捉任何字符串,它的模式如下:

/([a-z]+[-_]?){2,}[a-z]/ 
+0

实际上我没有得到这里的东西...我想确保有一个初始和结束的阿尔法,如果我忘记^和$我只匹配可以接受这个正则表达式的部分,不是吗? 并且具有/([a-z] + [-_]?){2,} [a-z] /也不会接受任何这些。 (你写道:“如果你合并了两个分隔符,正则表达式将对包括空格在内的所有字符作出反应。”)即使没有,{2,}也不起作用......我认为唯一的答案是杜里,不是吗? – lctv31

+0

好的!你说得对,我以前的回答不好。如果我明白你的问题,你需要检查你的字符串是否在开始和结束时都有字母字符。 下面的正则表达式应该可以解决你的问题: /^([az])+(.)+([az])+$/ – ptiswitz

+0

问题解决了^^,我的表情对我的需求没问题,只允许[a - ]或-_但这两个不连续。我的麻烦实际上是Duri解释的extraspace。谢谢你。 – lctv31