Abe*_*bel 21 .net java regex language-agnostic perl
这是因为关于形式化正则表达式语法的讨论.我已经看到了几个正则表达式解析器的这种行为,因此我标记它与语言无关.
采用以下表达式(根据您喜欢的语言调整它):
replace("input", "(.*)*", "$1")
Run Code Online (Sandbox Code Playgroud)
它将返回一个空字符串.为什么?
更奇怪的是,表达式replace("input", "(.*)*", "A$1B")
将返回字符串ABAB
.为什么双空配对?
免责声明:我知道回溯和贪婪的比赛,但杰弗里弗里德所规定的规则似乎要求.*
匹配所有内容,并且没有进行进一步的回溯或匹配.那为什么是$1
空的?
注意:与之比较(.+)*
,返回输入字符串.然而,http://regexhero.com显示仍有两场比赛,由于与上述相同的原因,这似乎很奇怪.
Tim*_*ker 25
让我们看看发生了什么:
(.*)
比赛"input"
."input"
被捕入群体1
.(.*)
重复,另一场比赛尝试:(.*)
匹配后面的空字符串"input"
.1
,覆盖"input"
.$1
现在包含空字符串.评论中的一个很好的问题:
然后为什么
replace("input", "(input)*", "A$1B")
回归"AinputBAB"
?
(input)*
比赛"input"
.它被替换为"AinputB"
.(input)*
匹配空字符串.它被替换为"AB"
($1
为空,因为它没有参与匹配)."AinputBAB"