如何重新使用捕获组来匹配不同的交替选择?
How to re-use a capturing group to match a different alternation choice?
我有一组词和另一组连词。我正在寻找一个匹配这些单词中任何一个的正则表达式,要求它们之间的连词:
- 如果的话是
(A|B|C)
- 连词是
(&)
- 然后匹配
A & C
、C & B
甚至 A & A
- 但不匹配
A + C
、A C
或 A & D
实际示例: 考虑这个与平台无关的正则表达式:/(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)
重用正则表达式本身。)
我有一组词和另一组连词。我正在寻找一个匹配这些单词中任何一个的正则表达式,要求它们之间的连词:
- 如果的话是
(A|B|C)
- 连词是
(&)
- 然后匹配
A & C
、C & B
甚至A & A
- 但不匹配
A + C
、A C
或A & D
实际示例: 考虑这个与平台无关的正则表达式:/(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)
重用正则表达式本身。)