这起源于一个讨论正式化正则表达式语法的话题。我在几个正则表达式解析器中都看到了这种行为,因此我将其标记为与特定编程语言无关。
拿以下表达式为例(根据您喜欢的编程语言进行调整):
replace("input", "(.*)*", "$1")
它会返回一个空字符串。为什么?
更加奇怪的是,表达式replace("input", "(.*)*", "A$1B")
将返回字符串ABAB
。为什么有两个空匹配项?
免责声明:我知道回溯和贪婪匹配,但是Jeffrey Friedl所规定的规则似乎是.*
匹配所有内容,不进行进一步的回溯或匹配。那么为什么$1
是空的?
注意:与(.+)*
相比,后者会返回输入字符串。然而,http://regexhero.com显示仍然有两个匹配项,这看起来与上述原因相同,有点奇怪。
(.*)*
会将整个匹配结果放在$1
中,而这正是这个问题所证明的不正确之处)。 - Abel((.*)*)
,所以整个匹配结果将会被放置在$1
中。(当然,外层括号完全是多余的,但答案是正确的。) - Tim Pietzcker(.*)*
/(.+)*
匹配的内容,即整个字符串_”,并且解释错误了。 - Abel