如何重新使用捕获组来匹配不同的替换选择?

时间:2016-07-01 08:17:28

标签: regex backreference capturing-group

我有一组单词和另一组有连词。我正在寻找一个匹配任何一个单词的正则表达式,要求它们之间的连接:

  • 如果单词为(A|B|C)
  • 并且连词是(&)
  • 然后匹配A & CC & B甚至A & A
  • 但不匹配A + CA CA & D

实际示例:考虑这个与平台无关的正则表达式:/(Huey|Dewey|Louie) and \1/

我希望它与“Huey和Louie”或“Dewey and Huey”匹配,但它只匹配“Huey和Huey”,因为反向引用仅匹配以前匹配的文本。

我可以使用/(Huey|Dewey|Louie) and (Huey|Dewey|Louie)/重复自己,但我认为有一种更聪明的方法可以在以后重新使用捕获组。这样可行吗?

1 个答案:

答案 0 :(得分:4)

如果您使用Perl(或具有足够兼容的正则表达式的语言),则可以执行此操作:

/(Huey|Dewey|Louie) and (?1)/

(?N)部分是“递归子模式”,与捕获组N中的子规则匹配相同的内容。 (\N之类的此引用与反向引用之间的区别在于\N匹配捕获组匹配的相同字符串(?N)重用正则表达式本身。)