用语言来说,我会将问题描述为“匹配A
或B
,匹配foo
,然后匹配A
或B
以前匹配“。
我可以使用以下正则表达式执行此操作:
AfooB|BfooA
我想知道是否有更有效的方法来做到这一点?我知道如何使用"\"
然后使用组号来引用捕获的组。在这种情况下,我想应用类似的说“不是在捕获的组中匹配的选项”(并且仍然仅限于匹配该组的其他可能的匹配)。
我正在寻找比简单"AfooB|BfooA"
更有效的东西的原因是在我的情况下"foo"
是一个非常长的模式,如果可能的话我宁愿减少重复。
答案 0 :(得分:5)
在匹配第二个A
或B
时,您可以使用具有反向引用限制的否定前瞻:
(A|B)foo(?!\1)(A|B)
基本上,(A|B)
匹配并将值捕获到第1组,然后foo
匹配foo
,(?!\1)
确保文本跟随与第一组中捕获的跟踪不同,然后它只能与(A|B)
匹配相反的值。
注意:如果A
和B
是单个字符,请使用字符类:([AB])foo(?!\1)([AB])