입력 문자열에 "$ {arbitraryTextHere}"의 모든 인스턴스를 찾을 루프를 작성하려고합니다. 예 :검색을 완료 한 후에 매처가 예외를 throw하는 이유
내 코드입니다 :someText의 $ {findMe} moreText $ {findMeToo} EvenMoreText $ {DontForgetMe} 여기
Pattern placeholderPattern = Pattern.compile("\\$\\{[\\w|\\d]+\\}");
Matcher placeholderMatcher = placeholderPattern.matcher(templateString);
int workingIndex = 0;
while(placeholderMatcher.find()){
workingIndex = placeholderMatcher.start();
}
참고 :이 테스트를하고있어 templateString out with with S"omeString ${someProp}"
이상한 점은 .find()
이 루프 내부로 들어가기 위해서는 true를 반환해야한다는 것이지만 .start()
은 IllegalStateException을 발생시킵니다. 이것이 이상한 이유는, 일치 연산자의 내부의 first
변수가 0보다 작은 경우, 일치 연산자 boolean search(int from)
메서드를 통해 .find()
을 사용하는 경우에만 .start()
이 IllegalStateException을 던지기 때문에 일치 항목이 없으면 이 0 이상인지 확인합니다. 일치하는 것이 발견되지 않으면 .find()
은 false를 반환 할 것이고 우리는 루프 본문에 올라가지 않을 것입니다.
그래서 정확히 무슨 일이 벌어지고 있습니까?
업데이트 : 위 코드를 모두 하나의 단위 테스트로 실행하도록 캡슐화했습니다. 그래서 문제는 단위 테스트에서 메소드가 호출되는 클래스에서이 문제를 갖는 것과 관련이 있다고 생각합니다. 그러나 이상한 일입니다. 나는이 문제에 대해 좀 더 깊이 파고 나서 업데이트를 게시 할 것이다.
업데이트 : 음, 나는 다시 켜고 (IntelliJ를 다시 시작하고 코드를 다시 컴파일 해 보았습니다.) 이제는 더 이상 손상되지 않으므로 그 부서에서 뭔가를 망쳐 놓았어야한다고 생각합니다.
문제점을 재현 할 수 없습니다. 다른 곳에서는'find()'와'start() '를 호출하지 않겠습니까? –
나는 그렇지 않을 것이라고 확신합니다. 내가 알아 차 렸던 한가지는 위의 디버깅을 시도하는 중에 이상한 반향이 일어나고 있다는 것입니다. 내가 위의 코드를 단위 테스트를 통해 실행했기 때문에 이것이 궁금하다. 나는 그것을 합법적 인 SSCCE를 게시 할 수 있도록 자체 시험 방법으로 분해 할 것이다. – David
당신의 문제와 관련이있는 것은 아니지만 (1)'\\ d'가 이미'\\ w '의 일부이기 때문에'[\\ w | \\ d]'가 올바르지 않은 것 같습니다. (2) '[...]'안의'|'는 OR을 의미하지는 않지만 리터럴로 바꾸어 클래스가'| '문자도 받아 들일 수있게합니다. – Pshemo