我有这个简单的正则义务,应该匹配任何数字和' '符号
/^[d+]+$/g
它的作用是:
1 => true
11 => false
11+11 => true
1+1 => false
这让我发疯!
(如果重要的话,我正在使用JavaScript)
重现您的错误时我做过的一些假设:
- 您使用的是
RegExp
-Prototype的test()
-Method,而不是String
-Prototype的match()
-Method。 - 您的模式存储在变量中,您可以通过多个呼叫
test()
-Method将其重复使用。
乍一看,结果有些出乎意料,但是我会尝试解释发生的事情。
您的REGEXP具有将全球范围设置为true。如下所述,这会导致随后的呼叫test()
-Method推进过去的比赛。本质上,这意味着在评估了第一个正则表达式并找到匹配项后,该匹配的索引存储在RegExp
-Object中,下一场比赛将以该索引开始,在开始时省略了一些字符。要进行更深入的解释,我建议阅读此线程。
这不是您想要的,对吗?我的快速建议是简单地删除global-flag ,因为从我的角度来看,您并不需要它。如果您想确保正则表达式仅与完整的字符串相匹配而不是子字符串,请使用^
和$
Metacharacters(如您已经一样)。
编辑:
如果您确实需要全局范围,请尝试使用String
-Prototype的match()
-Method,因为它不会超过以前的匹配。相反,它使用了前进的功能并捕获所有匹配项,然后重置索引。
var pattern = /^[d+]+$/g;
"1".match(pattern); // => true
"11+11".match(pattern); // => true
"1+1abc".match(pattern); // => false