Development Tip

replaceAll이 "불법 그룹 참조"로 인해 실패하는 이유는 무엇입니까?

yourdevel 2020. 12. 14. 20:57
반응형

replaceAll이 "불법 그룹 참조"로 인해 실패하는 이유는 무엇입니까?


교체해야합니다

\\\s+\\$\\$ to $$

나는 사용했다

String s = "  $$";
s = s.replaceAll("\\s+\\$\\$","$$");

하지만 예외가 발생합니다.

java.lang.IllegalArgumentException : 잘못된 그룹 참조


"\\$\\$"두 번째 매개 변수에서 사용 :

String s="  $$";
s=s.replaceAll("\\s+\\$\\$","\\$\\$");
//or
//s=s.replaceAll("\\s+\\Q$$\\E","\\$\\$");

$정규식의 대체 매개 변수에 있는 is 그룹 기호

그래서 당신은 그것을 탈출해야


에서 문자열 # 완전히 대체 javadoc의 :

대체 문자열의 백 슬래시 (\) 및 달러 기호 ($)는 결과가 리터럴 대체 문자열로 처리되는 경우와 다를 수 있습니다. Matcher.replaceAll을 참조하십시오. 원하는 경우 Matcher.quoteReplacement (java.lang.String)를 사용하여 이러한 문자의 특별한 의미를 억제하십시오.

따라서 Matcher # quoteReplacement 사용하여 임의의 대체 문자열을 이스케이프 할 수 있습니다 .

String s = "  $$";
s = s.replaceAll("\\s+\\$\\$", Matcher.quoteReplacement("$$"));

또한 패턴의 이스케이프는 Pattern # quote 로 수행 할 수 있습니다.

String s = "  $$";
s = s.replaceAll("\\s+" + Pattern.quote("$$"), Matcher.quoteReplacement("$$"));

여기서 문제는 정규 표현식이 아니라 대체입니다.

$는 ()일치하는 그룹 을 참조하는 데 사용됩니다 . 따라서 백 슬래시를 사용하여 이스케이프 처리해야합니다 (및 자바 컴파일러를 행복하게 만들기 위해 두 번째 백 슬래시).

String s="  $$";
s = s.replaceAll("\\s+\\$\\$", "\\$\\$");

이것이 올바른 방법입니다. 문자 $를 이스케이프 된 \\ $로 대체합니다.str.replaceAll("\\$", "\\\\\\$")


$ 정규식뿐만 아니라 대체 문자열에서도 특별한 의미가 있으므로 여기서도 이스케이프해야합니다.

s=s.replaceAll("\\s+\\$\\$", "\\$\\$");

String s="$$";
        s=s.replaceAll("\\s+\\$\\$","$$");

나는 같은 문제가 있었기 때문에 결국 모두를 분할로 대체하는 것을 구현했습니다.
나를 위해 예외를 해결했습니다.

public static String replaceAll(String source, String key, String value){
    String[] split = source.split(Pattern.quote(key));
    StringBuilder builder = new StringBuilder();
    builder.append(split[0]);
    for (int i = 1; i < split.length; i++) {
        builder.append(value);
        builder.append(split[i]);
    }
    while (source.endsWith(key)) {
        builder.append(value);
        source = source.substring(0, source.length() - key.length());
    }
    return builder.toString();
}

참고 URL : https://stackoverflow.com/questions/11913709/why-does-replaceall-fail-with-illegal-group-reference

반응형