这源于对正则表达式语法形式化的讨论。我已经通过几个正则表达式解析器看到了此行为,因此我将其标记为与语言无关。
采取以下表达式(针对您喜欢的语言进行调整):
replace("input", "(.*)*", "$1")
它将返回一个空字符串。为什么?
更奇怪的是,表达式replace("input", "(.*)*", "A$1B")将返回string ABAB。为什么双空比赛?
replace("input", "(.*)*", "A$1B")
ABAB
免责声明: 我知道回溯和贪婪的匹配,但是杰弗里·弗里德尔制定的规则似乎规定,.*匹配所有内容,并且不再进行进一步的回溯或匹配。那为什么是$1空的?
.*
$1
注意: 与比较(.+)*,返回输入字符串。但是,http://regexhero.com显示仍存在两个匹配项,出于与上述相同的原因,这似乎很奇怪。
(.+)*
让我们看看发生了什么:
(.*)
"input"
1
评论中的一个好问题:
那为什么还replace("input", "(input)*", "A$1B")回来"AinputBAB"呢?
replace("input", "(input)*", "A$1B")
"AinputBAB"
(input)*
"AinputB"
"AB"