2012-11-04 34 views
2

我嘗試創建一個正則表達式/替換對,與replaceAll()一起使用,它將捕獲目標字符串之前和之後的字符。是否有可能對非捕獲組有反向引用?

這裏是我的版本,對於簡單的情況下工作:

String adjacent = "fooaXbcXdbar".replaceAll(".*?(.)X(.).*?(?=(.X)|$)", "$1$2"); 

其根據需要(在提前結束的外觀是消耗字符串進行到replaceAll()工作的單一通話結束)產生"abcd"

然而,有一個邊緣的情況下,我似乎無法求解,當目標後的字符也是目標之前的字符:

String adjacent = "fooaXbXdbar".replaceAll(".*?(.)X(.).*?(?=(.X)|$)", "$1$2"); 

產生"ab",但我想"abbd"。正則表達式消耗了匹配的主要部分,使得以下輸入不匹配。

我試過看看周圍,但似乎無法得到它的工作。


注意:我對涉及循環或代碼等的解決方案不感興趣。只是尋求適用於上述邊界案例的正則表達式和替換字符串。

+5

要回答的問題標題:No. – 2012-11-04 02:15:17

回答

2

如何:

String adjacent = 
    "fooaXbXdbar".replaceAll(".*?(.)X(?:(?=(.)X)|(.).*?(?=.X|$))", "$1$2$3"); 

它是什麼,X後,它首先檢查它是否緊跟.X,在這種情況下,它抓住了.$2,並認爲比賽齊全;如果它發現它是而不是,緊接着是.X,它會繼續使用您已經使用的相同邏輯,將後續字符捕獲爲$3

(注:我已經與您的兩個例子測試這一點,但顯然這可能會錯過你需要支持其他情況下,我建議你自己測試它。)

+0

+1這不是我希望的「乾淨」的答案,但它是一個很好的答案 - 在單獨的比賽中迎合簡單和邊緣情況。不錯的工作! – Bohemian

相關問題