Javascript Regexp测试方法的怪异行为

Javascript Regexp test method weird behaviour

本文关键字:Regexp 测试方法 Javascript      更新时间:2023-09-26

我一直在尝试基于正则表达式计算字符串,但当我多次使用正则表达式进行测试时,我注意到了一种奇怪的行为。测试方法在正确和错误之间交替。检查此代码笔-->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

来自MDN文档:

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

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

要实现此操作,必须删除g修饰符。

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

阅读有关MDN 上lastIndex的更多信息