2011-06-14 4 views
1

다음에서는 두 번째 find()가 성공할 것으로 예상하지만 성공하지는 않습니다. 왜?수량 한정자와의 일치가 실패한 후 Java의 matcher.find()가 보유하는 상태는 어떤 종류입니까?

Matcher matcher = 
    Pattern.compile("\\s*asdf").matcher("apple banana cookie"); 

// returns false as expected 
matcher.find(); 

// resets groups (that weren't being explicitly being used anyway), but not state. 
matcher.usePattern(Pattern.compile("\\s*banana")); 

// returns false, expected true. 
System.out.println(matcher.find()); 

한정사가 첫 번째 정규 표현식에서 제거되면 ("asdf을"간단하게되고), 두 번째 경기는 성공합니다. Matcher 객체를 보면 어떤 종류의 그룹 정보가 첫 번째 실패 (find()가 실패한 후에 저장됩니다.)는 예상하지 못했지만 말입니다. 찾기()는 supposed으로 시작 부분 (이전에 일치하지 않는 경우) 또는 마지막으로 성공한 일치 항목의 인덱스에서 시작합니다. UsePattern()은 supposed입니다. 입력에서 Matcher의 위치를 ​​유지하고 그룹 정보를 삭제합니다 (다시 말하면 명시 적으로 사용하지 않았습니다).

나는 뭔가를 놓치고 있지만, 나는 무엇을 모르겠다. 나는 이것을 lookingAt()와 region (예 : this example)으로 구현해야한다고 생각하지만이 접근법이 작동하지 않는 이유를 모르겠습니다.

답변

1

오류가 발생하여 find()에 전화 할 때 문서가 다소 오도 된 (또는 실제로는 지정되지 않았습니다.) 것처럼 보입니다.

오류가 발생할 때까지 find()이 반복적으로 호출되지만 다시 설정하지 않고 실패한 적이 없다고 가정합니다. source code 보면

Matcher 인덱스 (현장 last)있는 것이 ') (찾기'다음을 수행 할 때 검색을 시작하고, find()가 실패 할 경우, 해당 인덱스가 마지막에 고급이고하지가 있는지 확인 다시 놓기.

reset()usePattern() 색인을 재설정합니다.

+0

내 구현에서는 재귀 호출에서 상태를 유지하기 위해 정규 표현식을 사용하고 있습니다. 그래서 원래의 문제를 해결하기 위해 경계를 설정하기 전에 정규 표현식을 재설정하는 이전 영역과 호출 영역 (oldStart, oldEnd)을 저장합니다. –

+0

영역이 내부 '마지막'필드와 다릅니다. 그것을 테스트 할 수 있습니다. find를 호출해도 영역이 변경되지 않습니다. – trutheality

5

첫 번째 정규식은 전체 문자열 (\\\\s*)을 사용합니다. 두 번째 정규식을 실행하면 일치하는 항목이 남아 있지 않습니다.

matcher.reset()으로 전화하면 예상대로 작동합니다.

+0

[Matcher JavaDoc] (http://download.oracle.com/javase/1.5.0/docs/api/java/util/regex/Matcher.html)을주의해서 다시 읽으십시오. 즉 "정규 표현식은 영역이라는 입력의 부분 집합에서 일치하는 것을 찾습니다. 기본적으로 영역에는 정규 표현 자의 모든 입력이 들어 있습니다." 내가 말할 수있는 한, region() 메소드 만이 문서에서 region을 수정하도록 정의되어 있습니다 (비록 region이 다른 시간에 수정 되었기 때문에 혼란이 있음을 알 수 있습니다). 그래서 find()는 실제로 region을 수정합니까? –