js中正则exec方法的一个诡异的现象

clipboard.png

今天偶然发现的,当我一直执行exe方法时,一遍是查找失败,一遍是成功,这样循环输出,不知道是为什么?

阅读 3.1k
4 个回答

正则/g的特点,表达式在第一次找到结果后会记录位置,下次执行会从这个位置继续找,而不是从头开始,如果只是为了查找是否存在,就不要用g标识了

调用全局的RegExp对象的 exec()时,它会在 RegExp实例的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExp实例的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

请参考 JavaScript正则表达式下之相关方法

《javascript高级程序设计》中有这样一句话:

正则表达式在不设置全局标志的情况下,在同一个字符串上多次调用 exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用 exec()则都会在字符串中继续查找新匹配项

var text = "cat, bat";
var pattern1 = /.at/;

var matches = pattern1.exec(text);
alert(matches.index);        //0
alert(matches[0]);           //cat
alert(pattern1.lastIndex);   //0

matches = pattern1.exec(text); 
alert(matches.index); //0 
alert(matches[0]); //cat 
alert(pattern1.lastIndex); //0

var pattern2 = /.at/g;

var matches = pattern2.exec(text); 
alert(matches.index); //0 
alert(matches[0]); //cat 
alert(pattern2.lastIndex); //3

matches = pattern2.exec(text);
alert(matches.index);        //5
alert(matches[0]);           //bat
alert(pattern2.lastIndex);   //8

matches = pattern2.exec(text);
alert(matches); //null
alert(pattern2.lastIndex);//0

具体正则的问题可以看我这篇博客《javascript高级程序设计》笔记:正则表达式

这个问题是跟g标志有关。启动g标志的时候,会启用一个lastIndex变量,这个是用来计算匹配到的子串在字符串中的位置的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏