我有这个简单的正则表达式,它应该匹配任何数字和“+”符号
/^[\d\+]+$/g
它的作用是这样的:
1 => true
11 => false
11+11 => true
1+1 => false
这让我发疯!
(如果重要的话,我正在使用 JavaScript)
最佳答案
我在重现您的错误时所做的一些假设:
- 您正在使用
RegExp
原型(prototype)的test()
方法,而不是match()
方法字符串
-原型(prototype)。 - 您的模式存储在一个变量中,您可以在多次调用
test()
方法时重复使用它。
乍一看,结果有些出乎意料,但我会尽力解释发生了什么。
您的 RegExp 将 global-Flag 设置为 true。这会导致对 test()
方法的后续调用超出先前的匹配项,如所述 here 。这本质上意味着,在计算第一个正则表达式并找到匹配项后,该匹配项的索引将存储到 RegExp 对象中,下一个匹配项将从该索引处开始,省略一些字符一开始。如需更深入的解释,我建议阅读 this thread .
这并不是你真正想要的,对吧?我的快速建议是简单地删除全局标志,因为从我的 Angular 来看,您并不真正需要它。如果您想确保正则表达式仅匹配完整字符串而不是子字符串,请使用 ^
和 $
元字符(就像您已经做的那样)。
编辑:
如果您确实需要全局标志,请尝试使用 String
原型(prototype)的 match()
方法,因为它不会超越之前的匹配。相反,它使用前进功能并捕获所有匹配项,然后重置索引。
var pattern = /^[\d\+]+$/g;
"1".match(pattern); // => true
"11+11".match(pattern); // => true
"1+1abc".match(pattern); // => false
关于javascript - 我的简单正则表达式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498753/