2014-02-14 40 views
-1

比方說,我們有以下的正則表達式:靜態捕獲組?

((a(.+?)c ?)+) 

這將匹配:

abc acc aac 

我想要做什麼:

((a(.+?)c ?)(a\3c ?)*) 

因此,我將只匹配

abc abc abc 

acc acc acc 

而不是項目#2(ABC ACC AAC)

...但是,如果沒有反向引用。

基本上,我希望#1(。+?)中的第三個捕獲組始終匹配任何第一個匹配。

這可能嗎?

爲了讓事情變得更多,這將需要在JavaScript的正則表達式引擎中工作。

+2

你想要一個沒有**反向引用的正則表達式**?因爲它似乎反向引用是你需要的:'((a(。+?)c?)(a(。+?)c?)(a \ 3c?)*)' – acdcjunior

+0

是的,js支持反向引用和大多數其他perl正則表達式功能,它基於... – dandavis

+0

@dandavis剛剛測試過,我不知道這個!我一直認爲它在_JavaScript_中不起作用。你現在已經爲我打開了一個全新的_RegExp_世界(不是我實際上在字符串操作中使用它) –

回答

0

如果因爲記憶值將在後面的參考中被逐字地比較而變化,則不能捕捉尾隨空格。移動捕獲括號外的變化變得非常簡單:

var rx= /(a(.+?)c) ?\1 ?\1/g ; 

// tests/demo 
"abc abc abc".match(rx) // ["abc abc abc"] 
"abc acc abc".match(rx) // null 
"abc acc aac".match(rx) // null 
"acc acc acc".match(rx) // ["acc acc acc"] 

所以,這是重複的一些額外的字符,以允許可選的空間,但它的作品。

+0

我希望找到一些*沒有反向引用* – user3281506

+0

不知道基於你的例子我明白。您是否想爲「abc abc abc」硬編碼不同的RegExp而不是「abc acc abc」?你列出幾個組合,並涵蓋他們都會採取很多RegExp對象... – dandavis

+0

第二個正則表達式正是我想要的,但我想知道是否有可能沒有反向引用。它也應該匹配「adc adc adc」或「axc axc axc」 - 但中間字符(不管它是什麼)在每次重複中都需要相同。我還應該注意到,這不是我想要構建的確切正則表達式,而是它的簡化版本。 – user3281506