当前位置:  开发笔记 > 编程语言 > 正文

Javascript Regexp测试方法奇怪的行为

如何解决《JavascriptRegexp测试方法奇怪的行为》经验,为你挑选了2个好方法。

我一直在尝试使用正则表达式来评估字符串,但是我注意到了一种奇怪的行为,当我用正则表达式多次测试时.测试方法在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修改器.



1> Felix Kling..:

从MDN文档:

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

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

要完成这项工作,您必须删除g修改器.



2> Domino..:

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

阅读有关lastIndexMDN的更多信息

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有