2013-08-15 3 views
4

임 신속한 정신 검사를하려고 ... 그리고 그 실패. 여기 내 코드입니다 -간단한 자바 정규식 던지고 illegalstateexception

import java.util.regex.*; 

public class Tester { 
    public static void main(String[] args) { 
     String s = "a"; 
     Pattern p = Pattern.compile("^(a)$"); 
     Matcher m = p.matcher(s); 
     System.out.println("group 1: " +m.group(1)); 
    } 
} 

그리고 내가 무엇을 기대하는 것은 group 1: a을 볼 수있다. 하지만 그 대신에 나는 IllegalStateException: no match found을 얻습니다. 그리고 나는 왜 그럴지 모릅니다.

편집 : 나는 또한 groupCount()를 인쇄하려고 그것을 당신이 m.group을 사용할 수 있도록 m.find() 또는 m.matches() 처음 호출 할 필요 1.

답변

10

가 말했다.

  • find은 늘도 추가해야하므로 전체 문자열이 패턴과 일치하는 경우
  • matches 확인합니다 (하나 이상 일치하는 항목이 상황에서 주로 사용)하여 패턴과 일치하는 각 문자열을 찾을 수 있습니다 귀하의 패턴에 ^$.

m.lookingAt()도 사용할 수 있지만 설명은 건너 뛸 수 있습니다 (문서에서 읽을 수 있음). Matcher#matches이 전체 String (일치하는 식의 중복 만들기 앵커 문자) 상기

4

사용 Matcher#matches 또는 Matcher#find 이전이 경우 Matcher.group(int)

if (m.find()) { 
    System.out.println("group 1: " +m.group(1)); 
} 

를 호출에 Matcher#find이 더 적합 Matcher에 대해서는 javadocs입니다. 성공적으로 일치하기 전에 어떤 부분을 쿼리하려고 시도하면 IllegalStateException이 발생합니다.

group(1) 전화를 if (matcher.find()) {}으로 마무리하면이 문제를 해결할 수 있습니다.

2

봐 일치로