2011-03-31 3 views
1

간단한 문제처럼 보입니다. 캡쳐 그룹을 추출하고 선택적으로 구분 문자열로 그룹을 제한해야합니다.구분 기호가있는 정규 표현식 캡처 그룹

은 아래 예제에서는 'CD'의 단락 문자 문자열을 제공하고 모든 경우에 'AB'를 반환 것으로 예상 : 'AB', 'ABCD'를, 그리고 여기에 'ABCDEFG'

public static void main(String[] args) { 
    String expected = "ab"; // Could be more or less than two characters 
    String[] tests = {"ab", "abcd", "abcdefg"}; 
    Pattern pattern = Pattern.compile("(.*)cd?.*"); 

    for(String test : tests) { 
     Matcher match = pattern.matcher(test); 
     if(match.matches()) { 
      if(expected.equals(match.group(1))) 
       System.out.println("Capture Group for test: " + test + " - " + match.group(1)); 
      else System.err.println("Expected " + expected + " but captured " + match.group(1)); 
     } else System.err.println("No match for " + test); 
    } 
} 

출력은 다음과 같습니다 :


    No match for ab 
    Capture Group for test: abcd - ab 
    Capture Group for test: abcdefg - ab 

가 나는 내다가 작동 할 수 있다고 생각하지만 옵션 (즉, 0 개 이상의 인스턴스) 하나가 있다고 생각하지 않는 코드는

+0

문제는 첫 번째'(. *)'비합법적 표현을 사용하더라도 정규식 - (? : cd)와'. *'- 그 밖의 모든 것은 선택 사항이므로 캡쳐 그룹은 전체 문자열과 일치가있을 것입니다. 정규식을보다 구체적으로 만들어야합니다. 또한 모든 테스트에 대해 Java 프로그램을 실행하는 대신 [이 웹 페이지] (http://www.regexplanet.com/simple/index.html)를 사용할 수 있습니다. –

+0

나는 정규식을 더 구체적으로 만들 수있는 방법을 잘 모르겠다 ... 예상되는 문자열의 길이는 하나 이상의 문자가 될 수있다. 그렇지 않으면 길이 제한자가 작동 할 것이지만, 그 외에는 그렇지 않다. 그것을 제한하는 다른 방법을 알아라. –

+1

'indexOf'와'substring'을 사용할 수 있습니까? – Melv

답변

4

이 시도 :

Pattern pattern = Pattern.compile("(.*?)(?:cd.*|$)"); 

.*?이 아닌 욕심, 그리고 정규 표현식의 나머지 중 아무것도 다음 cd, 또는 문자열의 끝과 일치합니다.

+0

우수 ... 고맙다 Jason !!! –

0

고객님의 유일한 문제는 ?d에만 적용된다는 것입니다. 대신 (cd)?을 시도하십시오.

+0

출력 :'abcd'와'abcdefg'에 실패 함 –