2016-09-19 71 views
1

我遇到命名捕獲組的問題並重新使用它們。看起來像我命名捕獲組A時,它首先捕獲類似「asd」的東西,然後使用\ k並嘗試再次使用捕獲組A的表達式,但它不起作用,因爲它不匹配正則表達式I originaly在A組中寫道,但是它試圖匹配先前匹配的內容,即「asd」。正則表達式:再次使用捕獲組

所以,如果我有這樣的:

^(?<A>(?:a|s|d))\k<A>$ 

我鍵入:

aa 

這工作,因爲捕獲組的第一個匹配的字母和\k<A>現在也在尋找一個。

但是,在as中鍵入不起作用,因爲第一個匹配a和\k<A>正在尋找另一個a。

我想要做的是再次使用捕獲組A的正則表達式本身。所以我想\k<A> = (?:a|s|d)

這裏有什麼問題,有沒有辦法解決它?

謝謝!

+2

您正在尋找[遞歸](http://www.regular-expressions.info/recurse.html)。不幸的是,這不是一個廣泛支持的功能。我不認爲posix-ere支持它。 –

+0

@Rawing是的,這工作。我使用\ g'name'來代替,但是我的實際正則表達式還存在其他一些問題,但現在一切正在運行。提交這個答案作爲答案,我會給你的觀點。 – Piwwoli

+0

如果您可以使用'\ g'name'',posix-ere標籤在這裏是錯誤的。什麼是環境? PHP?紅寶石? –

回答

1

使用pcre你可以使用遞歸。
但是,遞歸是一個用詞不當,它更像是一個函數調用。

的首選方式:

^
(?&A) 
(?&A) 
$ 
(?(DEFINE)  # Functions 
     (?<A>       # (1 start) 
      (?: a | s | d) 
    )        # (1 end) 
) 

內聯方式:

^
(?<A>       # (1 start) 
     (?: a | s | d) 
)        # (1 end) 
(?&A) 
$ 

兩個做同樣的事情。在使用內聯方式時,它仍然只是一個函數調用。
當你從一個函數內部調用自己時,這是更加遞歸的。
I.e. (?<A>(?:a|b|c)(?&A)*)並需要特殊保護。