다음에서는 두 번째 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)으로 구현해야한다고 생각하지만이 접근법이 작동하지 않는 이유를 모르겠습니다.
내 구현에서는 재귀 호출에서 상태를 유지하기 위해 정규 표현식을 사용하고 있습니다. 그래서 원래의 문제를 해결하기 위해 경계를 설정하기 전에 정규 표현식을 재설정하는 이전 영역과 호출 영역 (oldStart, oldEnd)을 저장합니다. –
영역이 내부 '마지막'필드와 다릅니다. 그것을 테스트 할 수 있습니다. find를 호출해도 영역이 변경되지 않습니다. – trutheality