2016-06-26 2 views
0

다음은 예입니다 일치 잡으려고 실패 "사람". 보시다시피, 등급이 Stuart, Jess, George 인 세 개의 이름이 있습니다. 내 정규 표현식 솔루션이 모든 것을 포착하지 못하는 이유를 모르겠습니다. 여기정규식은 모든

public static void main(String[] args) { 
    String input = "The two (Senior Officer Stuart & Officer Jess) were intercepted by Officer George."; 
    ArrayList<String> ranks = new ArrayList<String>(); 
    ranks.add("Senior Officer"); 
    ranks.add("Officer"); 
    for (String rank : ranks) { 
     Pattern pattern = Pattern.compile(".*" + rank + " ([a-zA-Z]*?) .*"); 
     Matcher m = pattern.matcher(input); 
     if (m.find()) { 
      System.out.println(rank); 
      System.out.println(m.group(1)); 
     } 
    } 
} 

및 출력입니다 : 여기 내 코드입니다

Senior Officer 
Stuart 
Officer 
Stuart 

(수석 책임자 및 담당자를 통해)를 두 번 스튜어트를 캡처하지만, 제스와 조지을 무시합니다. 나는 출력으로이 얻을 것으로 기대하고있다 :

Senior Officer 
Stuart 
Officer 
Stuart 
Officer 
Jess 
Officer 
George 
+0

(의견에 따라), 그러나 그 공간은 의심스러운'([ a-zA-Z] *?). *' –

+0

네,'if'가 아니라'if'를 사용해야합니다. –

+0

Pattern.compile (". *?"+ rank + "([a-zA-Z] *)"); ' –

답변

2

이 충분합니다

for (String rank : ranks) { 
    Pattern pattern = Pattern.compile("\\b" + rank + "\\s+([a-zA-Z]*)"); 
    Matcher m = pattern.matcher(input); 
    while (m.find()) { 
     System.out.println(rank); 
     System.out.println(m.group(1)); 
    } 
} 

Ideone Demo

정규식 고장 없음 정규식 전문가

Officer #Match Officer literally 
(#Capturing group 
    (?: #Non-capturing group 
    \s #Match space 
    (?!(?:Senior\s+)?Officer) #Negative lookahead assures that its impossible to match the word Senior(which is optional) and Officer literally 
    [A-Z][a-zA-Z]* #Match capital letter followed by combination of capital and small letter 
)* #Repeat the previous step any number of time till one of the condition of first letter being capital fails or word Officer is found 
) 
+0

2/3 단어 명사를 포착 할 수있는 방법이 있습니까? "에두아르도 가르시아 로페즈 (Eduardo Garcia Lopez)"의 예를 들어 첫 번째 단어 "Eduardo"대신 "Eduardo Garcia Lopez"전체를 포착 할 수 있습니까? – user3639557

+0

@ user3639557 당신은 그것을 할 수 있습니다. 그러나 당신이 미리 결정할 수 없기 때문에 문제가 있습니다. 얼마나 많은 단어를 캡처 할 수 있습니까? – rock321987

+0

어쨌든, 어휘가 어퍼 이니셜 인 한 어때요? – user3639557

0

각 계급의 for 당신이 발견을 사용하는 첫 번째 경기. 우선, for 안에 while 절이 필요합니다.

for (String rank : ranks) { 
     Pattern pattern = Pattern.compile(rank + " [A-z]+"); 
     Matcher m = pattern.matcher(input); 
     while (m.find()) { 
      System.out.println(rank); 
      System.out.println(m.group(1)); 
     } 
    } 

그러나이 두 번 "고위 장교"순위를 찾는 문제가 해결되지 않는 : 한 번 당신은 "고위 장교"한 번 당신이 "장교"를 검색하면 검색 할 때. 이 문제를 어떻게 처리 할 것인지 잘 모르겠습니다. 스튜어트를 두 번 나타나게하려면이 코드가 충분합니다. Stuart가 한 번만 감지되도록하려면 regEx를 사용해야합니다.

P. 온라인 도구를 사용하여 정규식을 코딩하기 전에 테스트합니다. 그것은 많은 시간을 절약합니다.

+0

@ user3639557 : 그는 사용하지 않는 동안 사용하는 것이 옳습니다. 1 + –

+0

@ user3639557 정규식을 업데이트했습니다 –