21

这源于关于形式化正则表达式语法的讨论。我已经使用几个正则表达式解析器看到了这种行为,因此我将其标记为与语言无关。

采用以下表达式(根据您喜欢的语言进行调整):

replace("input", "(.*)*", "$1")

它将返回一个空字符串。为什么?

更奇怪的是,表达式replace("input", "(.*)*", "A$1B")将返回字符串ABAB。为什么是双空匹配?

免责声明:我知道回溯和贪婪匹配,但Jeffrey Friedl制定的规则似乎要求.*匹配所有内容,并且不再进行回溯或匹配。那为什么是$1空的?

注意:与 比较(.+)*,它返回输入字符串。但是,http://regexhero.com显示仍然有两个匹配项,出于与上述相同的原因,这似乎很奇怪。

4

1 回答 1

25

让我们看看发生了什么:

  1. (.*)匹配"input"
  2. "input"被抓进群里1
  3. 正则表达式引擎现在位于字符串的末尾。但是由于(.*)是重复的,所以会进行另一次匹配尝试:
  4. (.*)匹配之后的空字符串"input"
  5. 空字符串被捕获到组1中,覆盖"input"
  6. $1现在包含空字符串。

评论中的一个好问题:

那为什么replace("input", "(input)*", "A$1B")返回"AinputBAB"呢?

  1. (input)*匹配"input"。它被替换为"AinputB"
  2. (input)*匹配空字符串。它被替换为"AB"$1是空的,因为它没有参加比赛)。
  3. 结果:"AinputBAB"
于 2013-01-24T11:27:23.460 回答