好的,所以我试图匹配所有行并获得匹配的字符串索引,但我遇到了一个奇怪的问题
var string = 'a\n',
regexp = /^.*$/gim;
如果你跑
regexp.exec(string);
它最终将无限匹配,为什么?我问的原因是因为人们在while循环中执行这些类型的匹配很常见,除非你确保前一个匹配索引不是当前索引,否则这将产生一个无限循环。
修改 所以解决我的问题需要我做
while (match = regexp.exec(string)) {
if (!match[0].length) {
regexp.lastIndex++;
}
}
答案 0 :(得分:2)
因为.*
匹配零长度字符串。在字符串的末尾,它总是可以再次匹配。
答案 1 :(得分:1)
它匹配字符串的结尾。当使用m
标志时,^
等于一行的开头...并且您在结尾处有一个新行,而lastIndex
(用于启动该行的值)搜索来自)不会移动,因为它匹配一个空字符串。
为了更好地理解这一点,请尝试使用:
var string = "a\n\n\b\n";
它也永远不会匹配“b”。
答案 2 :(得分:0)
您的字符串变量有2个NEWLINE字符,产生3行字符串
a
b
<<an empty line>>
您的RegEx声明您正在搜索与整行匹配的字符串,.*
表示任意字符为0次或更多次
由于空行与.*
正则表达式匹配,因此结果会以空字符串结束。