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