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

How to re-use a capturing group to match a different alternation choice?

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


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

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

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

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

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

(?N) 部分是一个 "recursive subpattern",与捕获组 N 中的子正则表达式匹配相同的东西。 (这与像 \N 这样的反向引用之间的区别在于 \N 匹配与捕获组匹配的相同 string(?N) 重用正则表达式本身。)