正则表达式匹配什么不匹配

时间:2016-04-26 08:00:33

标签: c# .net regex pattern-matching

用语言来说,我会将问题描述为“匹配AB,匹配foo,然后匹配AB以前匹配“。

我可以使用以下正则表达式执行此操作:

AfooB|BfooA

我想知道是否有更有效的方法来做到这一点?我知道如何使用"\"然后使用组号来引用捕获的组。在这种情况下,我想应用类似的说“不是在捕获的组中匹配的选项”(并且仍然仅限于匹配该组的其他可能的匹配)。

我正在寻找比简单"AfooB|BfooA"更有效的东西的原因是在我的情况下"foo"是一个非常长的模式,如果可能的话我宁愿减少重复。

1 个答案:

答案 0 :(得分:5)

在匹配第二个AB时,您可以使用具有反向引用限制的否定前瞻:

(A|B)foo(?!\1)(A|B)

基本上,(A|B)匹配并将值捕获到第1组,然后foo匹配foo(?!\1)确保文本跟随与第一组中捕获的跟踪不同,然后它只能与(A|B)匹配相反的值。

请参阅this regex demo

注意:如果AB是单个字符,请使用字符类:([AB])foo(?!\1)([AB])