2017-06-14 59 views
2

我試圖匹配所有在句子中匹配正則表達式的組,但這些組在句子中具有共同字符。 我面對這個問題: 爲例,在這樣的句子:使用常見字符的正則表達式捕獲組

A + B + C + d

我想catpure:

A + B 

然後

B + C 

then

C + D 

隨着java.utils.regex.Matcher.find(帶圖案([A-Z] \+ [A-Z])regex101) 它開始只有最後匹配字符所以我只匹配A + B則C + D.

後下一組匹配

有沒有辦法用正則表達式來做到這一點?

+1

之前,我們建議任何解決方案後,我們應該知道輸入的所有要求。否則,我們需要在每次決定告訴我們更多關於每個單獨需求的信息時改變我們的想法。 – Pshemo

+0

現在,其中一個想法將匹配一個部分(A +),並使用前瞻來捕獲另一個(B)。如何編寫它取決於實際的數據格式。 – Pshemo

+0

謝謝@Pshemo您的回答! 沒有特殊的數據格式。在那之後,我只想把A和B聯繫起來,然後把B聯繫到C,然後把C聯繫到D中。 問題在於,如果我沒有弄錯,在第一場比賽中B不在一個組中。 – tropseraph68

回答

3

我先行內同時匹配,則消耗1

查找全球(?=([A-Z]\s*\+\s*[A-Z]))[A-Z]
打印第1組每場比賽或者只是得到一個數組。

重疊工作匹配與消費。
在斷言中匹配比需要的更多,然後消耗更少。
消費重新定位下一場比賽的開始。

此過程使其重疊。

擴展

(?= 
     ([A-Z] \s* \+ \s* [A-Z]) # (1) 
) 
[A-Z] 

匹配

** Grp 1 - (pos 0 , len 5) 
A + B 
    ** Grp 1 - (pos 4 , len 5) 
B + C 
    ** Grp 1 - (pos 8 , len 5) 
C + D 
+0

最後一個'[A-Z]'是什麼? '「(?=([A-Z] \\ s * \\ + \\ s * [A-Z]))」'也適用。 – saka1029

+0

@ saka1029 - 是的。你找到的東西叫做_bump along_。如果正則表達式引擎匹配零寬度斷言並且沒有消耗任何東西(即最後一個「[A-Z]」),它會自動將當前位置增加1個字符。所以,這個用於這個'1234'的'(?=(。))'會找到4個匹配項。現實情況是'[AZ]'可以是一個大的子表達式,其自然長度可以大於1.在這種情況下,您需要直接使用它,所以它不會被困在下一場比賽的+1位置。當然如果'[A-Z]'是你的單位。 – sln

+0

@ saka1029 - 示例https://regex101.com/r/Bgm2j0/2而非此https://regex101.com/r/Bgm2j0/3 – sln