2016-04-26 110 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