为什么(。*)*制作两个匹配并在组$ 1中不选择任何内容?

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

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

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

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

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

免责声明:我知道回溯和贪婪的比赛,但杰弗里弗里德所规定的规则似乎决定了.*匹配一切,没有进一步的回溯或匹配。 那为什么$1是空的?

注意:(.+)* ,返回输入字符串。 然而, http://regexhero.com显示仍有两场比赛,由于与上述相同的原因,这似乎很奇怪。

让我们看看发生了什么:

  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"