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 그룹 기호
그래서 당신은 그것을 탈출해야
대체 문자열의 백 슬래시 (\) 및 달러 기호 ($)는 결과가 리터럴 대체 문자열로 처리되는 경우와 다를 수 있습니다. 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
'Development Tip' 카테고리의 다른 글
React에서 조건부 스타일을 처리하는 올바른 방법 (0) | 2020.12.15 |
---|---|
Jenkins가 BitBucket git 저장소로 푸시를 빌드하도록하려면 어떻게해야합니까? (0) | 2020.12.14 |
페이지를 새로 고치지 않고 양식 데이터를 PHP로 전달하는 AJAX로 양식 제출 (0) | 2020.12.14 |
Eclipse의 gcc C ++ 컴파일러 버전을 어떻게 확인합니까? (0) | 2020.12.14 |
Spring Webservice의 START_ARRAY 토큰에서 개체의 인스턴스를 역 직렬화 할 수 없습니다. (0) | 2020.12.14 |