这源于对正则表达式语法形式化的讨论。我已经在几个正则表达式解析器中看到了这种行为,因此我将其标记为与语言无关。
采用以下表达式(根据您喜欢的语言进行调整):
replace("input", "(.*)*", "$1")
它将返回一个空字符串。为什么?
更奇怪的是,表达式 replace("input", "(.*)*", "A$1B")
将返回字符串 ABAB
。为什么是双空匹配?
免责声明:我知道回溯和贪婪匹配,但Jeffrey Friedl 制定的规则似乎规定 .*
匹配所有内容,并且不进行进一步的回溯或匹配。那为什么$1
是空的?
注意:与返回输入字符串的(.+)*
进行比较。但是,http://regexhero.com显示仍然有两个匹配项,出于与上述相同的原因,这看起来很奇怪。
最佳答案
让我们看看会发生什么:
(.*)
匹配"input"
。"input"
被捕获到组1
中。- 正则表达式引擎现在位于字符串的末尾。但是由于
(.*)
重复了,所以会进行另一次匹配尝试: (.*)
匹配"input"
之后的空字符串。- 将空字符串捕获到组
1
中,覆盖“input”
。 $1
现在包含空字符串。
评论中的一个好问题:
Then why does
replace("input", "(input)*", "A$1B")
return"AinputBAB"
?
(input)*
匹配"input"
。它被"AinputB"
替换。(input)*
匹配空字符串。它被"AB"
替换($1
为空,因为它没有参与比赛)。- 结果:
"AinputBAB"
关于java - 为什么 (.*)* 进行两个匹配并且在 $1 组中没有选择任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14500095/