我有这个简单的正则表达式,应该匹配任何数字和'+'符号
/^[\d\+]+$/g
它的作用是:
1 => true
11 => false
11+11 => true
1+1 => false
这让我疯了!
(我正在使用JavaScript,如果重要的话)
答案 0 :(得分:4)
我在复制错误时所做的一些假设:
test()
- 原型的RegExp
- 方法,而不是match()
- 原型的String
- 方法。test()
- 方法重复使用它。乍一看,结果有些出乎意料,但我会尝试解释发生了什么。
您的RegExp将global-Flag设置为true。这导致后续调用test()
- 方法提前超过之前的匹配,如here所述。这实际上意味着在评估第一个正则表达式并找到匹配项后,此匹配的索引将存储到RegExp
- 对象中,下一个匹配将从该索引处开始,省略一些开头的字符。有关更深入的解释,我建议您阅读this thread。
这不是你想要的,对吧?我的快速建议是简单地删除global-flag ,因为从我的角度来看你并不需要它。如果要确保正则表达式仅匹配完整字符串而不是子字符串,请使用^
和$
元字符(如您所做的那样)。
修改强>
如果您确实需要global-flag,请尝试使用match()
- String
- 原型的方法,因为它不会超过之前的匹配。相反,它使用前进功能并捕获所有匹配,然后重置索引。
var pattern = /^[\d\+]+$/g;
"1".match(pattern); // => true
"11+11".match(pattern); // => true
"1+1abc".match(pattern); // => false