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

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

让我们看看发生了什么:

  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"

  • @samuil:`.+`与空字符串不匹配. (3认同)