Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有全局多行无限匹配的RegExp_Javascript_Regex - Fatal编程技术网

Javascript 具有全局多行无限匹配的RegExp

Javascript 具有全局多行无限匹配的RegExp,javascript,regex,Javascript,Regex,好的,所以我试图匹配所有行并获得匹配的字符串索引,但我遇到了一个奇怪的问题 var string = 'a\n', regexp = /^.*$/gim; 如果你跑 regexp.exec(string); 它最终将无限地匹配“”,为什么?我之所以这样问是因为人们通常在while循环中执行这些类型的匹配,这将产生一个无限循环,除非您确保前面的匹配索引不是当前索引 编辑 所以解决我的问题需要我去做 while (match = regexp.exec(string)) { if

好的,所以我试图匹配所有行并获得匹配的字符串索引,但我遇到了一个奇怪的问题

var string = 'a\n',
    regexp = /^.*$/gim;
如果你跑

regexp.exec(string);
它最终将无限地匹配“”,为什么?我之所以这样问是因为人们通常在while循环中执行这些类型的匹配,这将产生一个无限循环,除非您确保前面的匹配索引不是当前索引

编辑 所以解决我的问题需要我去做

while (match = regexp.exec(string)) {
    if (!match[0].length) {
        regexp.lastIndex++;
    }
}

因为
*
匹配零长度字符串。在字符串末尾,它总是可以再次匹配该字符串。

因为
*
匹配的是零长度字符串。在字符串末尾,它总是可以再次匹配该字符串。

因为
*
匹配的是零长度字符串。在字符串末尾,它总是可以再次匹配该字符串。

因为
*
匹配的是零长度字符串。在字符串的末尾,它总是可以再次匹配该字符串。

它正在匹配字符串的结尾。当使用
m
标志时,
^
等于行的开头。。。最后有一个新行,
lastIndex
(用于开始搜索的值)不会从该行移动,因为它匹配了一个空字符串

为了更好地理解这一点,请尝试使用以下方法:

var string = "a\n\n\b\n";

它也永远不会匹配“b”。

它匹配字符串的结尾。当使用
m
标志时,
^
等于行的开头。。。最后有一个新行,
lastIndex
(用于开始搜索的值)不会从该行移动,因为它匹配了一个空字符串

为了更好地理解这一点,请尝试使用以下方法:

var string = "a\n\n\b\n";

它也永远不会匹配“b”。

它匹配字符串的结尾。当使用
m
标志时,
^
等于行的开头。。。最后有一个新行,
lastIndex
(用于开始搜索的值)不会从该行移动,因为它匹配了一个空字符串

为了更好地理解这一点,请尝试使用以下方法:

var string = "a\n\n\b\n";

它也永远不会匹配“b”。

它匹配字符串的结尾。当使用
m
标志时,
^
等于行的开头。。。最后有一个新行,
lastIndex
(用于开始搜索的值)不会从该行移动,因为它匹配了一个空字符串

为了更好地理解这一点,请尝试使用以下方法:

var string = "a\n\n\b\n";

它也永远不会与“b”匹配。

字符串变量有2个换行符,结果是一个3行字符串

a
b
<<an empty line>>
a
B
您的正则表达式声明您正在搜索与整行匹配的字符串,
*
表示任何字符0次或多次


由于空行与
*
Regex匹配,因此结果将是空字符串。

字符串变量有2个换行符,结果是3行字符串

a
b
<<an empty line>>
a
B
您的正则表达式声明您正在搜索与整行匹配的字符串,
*
表示任何字符0次或多次


由于空行与
*
Regex匹配,因此结果将是空字符串。

字符串变量有2个换行符,结果是3行字符串

a
b
<<an empty line>>
a
B
您的正则表达式声明您正在搜索与整行匹配的字符串,
*
表示任何字符0次或多次


由于空行与
*
Regex匹配,因此结果将是空字符串。

字符串变量有2个换行符,结果是3行字符串

a
b
<<an empty line>>
a
B
您的正则表达式声明您正在搜索与整行匹配的字符串,
*
表示任何字符0次或多次



由于一个空行与
*
Regex匹配,您将得到一个空字符串。

那么您是说在运行这种类型的匹配时,内部javascript正在执行最后一次索引检查
'a\nb\n',这似乎是意外的行为。我猜是因为它更原始,由调用方决定。那么您是说内部javascript在运行这种类型的匹配时正在执行最后一次索引检查
'a\nb\n。匹配(/^.$/gim)
是否有理由
exec
不单独执行此任务,这似乎是意外的行为。我猜是因为它更原始,由调用方决定。那么您是说内部javascript在运行这种类型的匹配时正在执行最后一次索引检查
'a\nb\n。匹配(/^.$/gim)
是否有理由
exec
不单独执行此任务,这似乎是意外的行为。我猜是因为它更原始,由调用方决定。那么您是说内部javascript在运行这种类型的匹配时正在执行最后一次索引检查
'a\nb\n。匹配(/^.$/gim)
是否有理由
exec
不单独执行此任务,这似乎是出乎意料的行为。我猜是因为它更原始,由打电话的人决定。他理解为什么它第一次匹配空行。他的问题是为什么它没有注意到它已经匹配了,当你再次调用它时返回
false
。我在他的问题中遗漏了这个细节。谢谢你纠正我。他理解为什么第一次它与空行匹配。他的问题是为什么它没有注意到它已经匹配了,当你再次调用它时返回
false
。我在他的问题中遗漏了这个细节。谢谢你纠正我。他理解为什么第一次它与空行匹配。他的问题是为什么它没有注意到它已经匹配了,当你再次调用它时返回
false
。我在他的问题中遗漏了这个细节。谢谢你纠正我