我一直在尝试使用正则表达式来评估字符串,但是我注意到了一种奇怪的行为,当我使用正则表达式多次测试时。测试方法在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
答案 0 :(得分:7)
与
exec()
(或与之结合使用)一样,在同一个全局正则表达式实例上多次调用的test()
将超过上一个匹配。
因此,第二次调用方法时,它会在第一次匹配后查找匹配项,即+56982249953
之后。没有匹配,因为模式被锚定到字符串的开头(^
)(并且因为没有剩下的字符),所以它返回false
。
要完成这项工作,您必须删除g
修饰符。
答案 1 :(得分:5)
这是因为test
方法与许多RegExp
方法一样,在与g
标志一起使用时,会尝试在同一字符串中查找多个匹配项。为此,它会在RegExp的lastIndex
属性中跟踪它应该搜索的位置。如果您不需要查找多个匹配项,请不要放置g
标记。如果您想使用它,只需记住在想要测试新字符串时将regex.lastIndex
设置为0.