繁体   English   中英

Javascript 正则表达式测试方法奇怪的行为

[英]Javascript Regexp test method weird behaviour

我一直在尝试基于正则表达式评估字符串,但是我注意到一个奇怪的行为,并且当我多次使用正则表达式进行测试时。 测试方法在真假之间交替。 检查这个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

MDN文档中

exec() (或与其结合使用)一样,在同一全局正则表达式实例上多次调用的test()将前进到先前的匹配。

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

为此,您必须删除g修饰符。

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

阅读有关MDN的lastIndex更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM