我的简单正则表达式不起作用

时间:2014-02-01 13:40:39

标签: javascript regex

我有这个简单的正则表达式,应该匹配任何数字和'+'符号

/^[\d\+]+$/g

它的作用是:

1  => true
11 => false
11+11 => true
1+1 => false

这让我疯了!

(我正在使用JavaScript,如果重要的话)

1 个答案:

答案 0 :(得分:4)

我在复制错误时所做的一些假设:

  1. 您正在使用test() - 原型的RegExp - 方法,而不是match() - 原型的String - 方法。
  2. 您的模式存储在变量中,您可以通过多次调用test() - 方法重复使用它。
  3. 乍一看,结果有些出乎意料,但我会尝试解释发生了什么。

    您的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