为什么(。*)*制作两个匹配并在组$ 1中不选择任何内容?
这是因为关于forms化正则表达式语法的讨论。 我已经看到了几个正则表达式解析器的这种行为,因此我标记它与语言无关。
采用以下表达式(根据您喜欢的语言调整它):
replace("input", "(.*)*", "$1")
它将返回一个空字符串。 为什么?
更奇怪的是,表达式replace("input", "(.*)*", "A$1B")
将返回字符串ABAB
。 为什么双空配对?
免责声明:我知道回溯和贪婪的比赛,但杰弗里弗里德所规定的规则似乎决定了.*
匹配一切,没有进一步的回溯或匹配。 那为什么$1
是空的?
注意:与(.+)*
,返回输入字符串。 然而, http://regexhero.com显示仍有两场比赛,由于与上述相同的原因,这似乎很奇怪。
让我们看看发生了什么:
-
(.*)
匹配"input"
。 -
"input"
被捕获到组1
。 - 正则表达式引擎现在位于字符串的末尾。 但由于
(.*)
重复,因此进行了另一次匹配尝试: -
(.*)
匹配"input"
后的空字符串。 - 空字符串被捕获到组
1
,覆盖"input"
。 -
$1
现在包含空字符串。
评论中的一个很好的问题:
那么为什么
replace("input", "(input)*", "A$1B")
返回"AinputBAB"
?
-
(input)*
匹配"input"
。 它被"AinputB"
取代。 -
(input)*
匹配空字符串。 它被"AB"
取代($1
为空,因为它没有参加比赛)。 - 结果:
"AinputBAB"