2013-06-03 2 views
0

다른 일치 항목에 포함 된 정규식 일치를 얻으려면 어떻게해야합니까?자바 정규식 겹침 일치

동일한 문장 내에서 도시 이름이 뒤 따르는 사람과 이름을 일치 시키려고합니다. 그래서 나는 이렇게하고있다 :

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."); 

이것은 "Bob and Mary가 파리에 갈 계획이다"와 일치 할 것이다. 그러나 그것은 "마리아가 파리에 갈 계획"과 일치하지 않는다. 사실 내가 언급 한 첫 번째 경기의 일부이다. "Mary"가 시작하는이 두 번째 하위 경기는 어떻게 얻을 수 있습니까? 정확한

Bob and Mary are planning to go to Paris. 

:에

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

결과. 그러나 다음과 같은 출력을 기대할 수 있습니다.

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

당신이 달성하려고하는 무엇을? – gkalpak

+0

사람의 이름 뒤에 도시가 오는 텍스트 단편을 얻으려고합니다. 사람들과 도시의 이름은 알려져 있으며, 나는 'Mary', 'Bob'및 도시를 삽화로 제공합니다. 그리고 그 모든 일이 필요합니다. 예를 들어, "Bob과 Mary는 파리에 갈 계획입니다." 나는 또한 "마리아는 파리에 갈 계획"이라고 요구합니다. – 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

예, 둘러보기는 매우 강력하고 유용한 메커니즘입니다. BTW 나는 문장의 나머지를 포함하는 원래 정규식으로 내 대답을 업데이 트했습니다. 그것은 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