2013-12-16 1 views
3

입력 문자열에 "$ {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를 다시 시작하고 코드를 다시 컴파일 해 보았습니다.) 이제는 더 이상 손상되지 않으므로 그 부서에서 뭔가를 망쳐 놓았어야한다고 생각합니다.

+2

문제점을 재현 할 수 없습니다. 다른 곳에서는'find()'와'start() '를 호출하지 않겠습니까? –

+0

나는 그렇지 않을 것이라고 확신합니다. 내가 알아 차 렸던 한가지는 위의 디버깅을 시도하는 중에 이상한 반향이 일어나고 있다는 것입니다. 내가 위의 코드를 단위 테스트를 통해 실행했기 때문에 이것이 궁금하다. 나는 그것을 합법적 인 SSCCE를 게시 할 수 있도록 자체 시험 방법으로 분해 할 것이다. – David

+1

당신의 문제와 관련이있는 것은 아니지만 (1)'\\ d'가 이미'\\ w '의 일부이기 때문에'[\\ w | \\ d]'가 올바르지 않은 것 같습니다. (2) '[...]'안의'|'는 OR을 의미하지는 않지만 리터럴로 바꾸어 클래스가'| '문자도 받아 들일 수있게합니다. – Pshemo

답변

1

내 질문에 대한 최신 업데이트에 따라 IntelliJ를 다시 시작하고 코드를 다시 컴파일하면 문제가 해결되었습니다.

관련 문제