Javascript Regexp测试方法奇怪的行为

时间:2015-12-02 04:09:13

标签: javascript regex

我一直在尝试使用正则表达式来评估字符串,但是我注意到了一种奇怪的行为,当我使用正则表达式多次测试时。测试方法在true和false之间交替。 检查此codepen - > http://codepen.io/gpincheiraa/pen/BoXrEz?editors=001

var emailRegex = /^([a-zA-Z0-9_\.\-]){0,100}\@(([a-zA-Z0-9\-]){0,100}\.)+([a-zA-Z0-9]{2,4})+$/,
  phoneChileanRegex = /^\+56\S*\s*9\S*\s*\d{8}(?!\@\w+)/g,
   number = "+56982249953";

if(!number.match(phoneChileanRegex)  && !number.match(emailRegex) ) {
  console.log("it's not a phone number or email address");
}

//Weird Behaviour
console.log(phoneChileanRegex.test(number)); --> true
console.log(phoneChileanRegex.test(number)); --> false

2 个答案:

答案 0 :(得分:7)

来自MDN documentation

  

exec()(或与之结合使用)一样,在同一个全局正则表达式实例上多次调用的test()将超过上一个匹配。

因此,第二次调用方法时,它会在第一次匹配后查找匹配项,即+56982249953之后。没有匹配,因为模式被锚定到字符串的开头(^)(并且因为没有剩下的字符),所以它返回false

要完成这项工作,您必须删除g修饰符。

答案 1 :(得分:5)

这是因为test方法与许多RegExp方法一样,在与g标志一起使用时,会尝试在同一字符串中查找多个匹配项。为此,它会在RegExp的lastIndex属性中跟踪它应该搜索的位置。如果您不需要查找多个匹配项,请不要放置g标记。如果您想使用它,只需记住在想要测试新字符串时将regex.lastIndex设置为0.

Read more about lastIndex on MDN