Regex 如何重新使用捕获组以匹配不同的替代选择?

Regex 如何重新使用捕获组以匹配不同的替代选择?,regex,backreference,capturing-group,Regex,Backreference,Capturing Group,我有一组词和另一组连词。我正在寻找一个正则表达式,它匹配这些单词中的任何一个,并要求它们之间的连词: 如果单词是(A | B | C) 连词是(&) 然后匹配A&C,C&B甚至A&A 但不匹配A+C,A-C或A&D 实际例子:< /强>考虑这个平台无关的正则表达式: /(休伊·杜威·路易)和\ 1 / < /COD> < /P> 我想让它匹配“休伊和路易”或“杜威和休伊”,但它只匹配“休伊和休伊”,因为反向引用只匹配以前匹配的文本 我可以通过使用/(休伊|杜威|路易)和(休伊|杜威|路易

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

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

<强>实际例子:< /强>考虑这个平台无关的正则表达式:<代码> /(休伊·杜威·路易)和\ 1 / < /COD> < /P> 我想让它匹配“休伊和路易”或“杜威和休伊”,但它只匹配“休伊和休伊”,因为反向引用只匹配以前匹配的文本


我可以通过使用
/(休伊|杜威|路易)和(休伊|杜威|路易)/
来重复我自己,但我认为有一种更聪明的方法,可以在以后重新使用捕获组。这在某种程度上是可行的吗?

如果您使用的是Perl(或具有足够兼容正则表达式的语言),则可以这样做:


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

@rock321987:我希望你不会无缘无故地害怕,只是再过一会儿。不管怎样,把单词组放在一个变量中可以解释这个枯燥的问题,我想你现在有了@melpomene的答案,如果你使用的编程语言支持递归的话。@rock321987:太糟糕了,你删除了你的评论。好吧,现在这个评论没有意义了,当它的答案是hh,递归子模式,我喜欢!这显然是为了这个目的而构思的,而且简洁明了。尽管它可能被认为是异国情调,但它似乎得到了一个体面的人的支持。@SWLim:我知道当有人回答时。你…吗?因为这对我来说不是正确的解决方案,但这是一个好的正确答案。不过,至少要等半天才能得到更多的关注才是公平的。@dakab你说得对,谢谢你指出这一点。很抱歉,根据您的评论,我认为此答案是正确的解决方案,您可能忘记接受此答案。
/(Huey|Dewey|Louie) and (?1)/