2013-06-03 81 views
0

如何獲得包含在另一個匹配中的正則表達式匹配?java獲取正則表達式重疊匹配

我試圖在相同的句子中匹配一個人的名字後跟一個城市。所以我這樣做:

String regex="(Bob|Mary)\\b[^\\.\\?!]*?\\b(Paris|London)\\b.*?[\\.\\?!]"; 
Pattern pattern=Pattern.compile(regex, Pattern.CASE_INSENSITIVE); 
Matcher matcher=pattern.matcher("Bob and Mary are planning to go to Paris. They want to leave before July."); 

這將匹配「鮑勃和瑪麗打算去巴黎。」,這是正確的。但它不符合「瑪麗計劃去巴黎」,這實際上是我提到的第一場比賽的一部分。我如何獲得由「瑪麗」開始的第二場次比賽?

while (matcher.find()){ 
     System.out.println(matcher.group());    
    } 

結果:

Bob and Mary are planning to go to Paris. 

這是正確的。但我期望輸出如下:

Bob and Mary are planning to go to Paris. 
Mary are planning to go to Paris. 
+1

什麼是你想實現什麼? – gkalpak

+0

我試圖獲得一個人的名字後跟一個城市的文本片段。人們和城市的名字是已知的,我提供了'瑪麗','鮑勃'和城市的插圖。我需要所有這些。在這個例子中,我需要「鮑勃和瑪麗打算去巴黎。」我也需要「瑪麗計劃去巴黎」。 – juancito

回答

1

這是你正在嘗試做什麼?

String regex = "(?=((Bob|Mary)\\b[^\\.\\?!]*?\\b(Paris|London)\\b.*?[\\.\\?!]))"; 
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); 
Matcher matcher = pattern 
     .matcher("Bob and Mary are planning to go to Paris. They want to leave before July."); 
while (matcher.find()){ 
    System.out.println(matcher.group(1)); 
} 

輸出:

Bob and Mary are planning to go to Paris. 
Mary are planning to go to Paris. 

通常的正則表達式會消耗它會匹配曾經那麼就不可能在明年的比賽用字符串的同一部分。爲了擺脫這個問題,我們可以使用look-ahead機制(?=...)groups

+0

是的!這正是我想要做的。除了匹配城市之外,我還需要其他的句子(在這種情況下,除了句子結尾處的句點之外,什麼也沒有)。但是,是的,這是主意。 – juancito

+0

謝謝Pshemo。我曾閱讀過有關其他帖子的預測,但我不確定它是否也適用於我的案例。 – juancito

+0

是的,環視是非常強大和有用的機制。順便說一句,我用你原來的正則表達式更新了我的答案,以包含其餘的句子。不,它應該是OK :) – Pshemo

1

你可以嘗試使用正則表達式這樣還有:

String s = "Bob and Mary are planning to go to Paris. They want to leave before July."; 
     Pattern p = Pattern.compile("(Bob|Mary).*Paris"); 
     Matcher m = p.matcher(s); 
     int i = 0; 
     while(m.find(i)) { // set start index for "find" 
      System.out.println(m.group()); 
      i = m.start() + 1; // update start index to start from beginning of last match + 1 
     } 
    } 

O/P:

Bob and Mary are planning to go to Paris 
Mary are planning to go to Paris