2016-04-26 118 views
3

换言之,我会将问题描述为“匹配AB,匹配foo,然后匹配AB,它们之前不匹配”。正则表达式匹配什么不匹配

我可以用下面的正则表达式做:

AfooB|BfooA 

我不知道是否有更有效的方式来做到这一点?我知道如何使用"\"然后输入组号来引用捕获的组。在这种情况下,我想申请一些东西,比如说“不是在捕获组中匹配的选项”(并且仍然被限制为只匹配该组的其他可能匹配)。

我寻找的东西比简单的"AfooB|BfooA"更有效的原因是,在我的例子中"foo"是一个很长的模式,如果可能的话我宁愿减少重复。

+0

如果标题可以更好地描述请更改帮助别人:) – RebamAsia1

回答

5

匹配第二AB时你可以使用一个负先行与反向引用限制:

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

基本上,(A|B)比赛并捕获值存入第1组,然后foo火柴foo(?!\1)品牌确保下面的文本与捕获到第一组中的文本不同,然后它只能匹配与(A|B)相反的值。

this regex demo

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

+1

就像一个魅力!我会在几分钟内接受答案,当我被允许:) – RebamAsia1