TLDR : theString = theString.replace("\\", "\\\\");
대신 사용하십시오.
문제
replaceAll(target, replacement)
에는 정규식 (regex) 구문을 사용 target
하고 부분적으로 replacement
.
문제는 \
정규식 ( \d
숫자를 나타내는 것처럼 사용할 수 있음 )과 문자열 리터럴 ( "\n"
줄 구분 기호를 나타내거나 \"
일반적으로 문자열 리터럴의 끝을 나타내는 큰 따옴표 기호를 이스케이프 하는 데 사용할 수 있음)의 특수 문자입니다 .
이 두 경우 모두 \
심볼 을 생성하기 위해 심볼 앞에 추가 (예 : 를 통해 문자열 리터럴에서 이스케이프 ) 하여 심볼을 이스케이프 할 수 있습니다 (특수 문자 대신 리터럴로 만듭니다 ).\
"
\"
따라서 target
정규식을 표현하려면 \
기호를 유지해야하며 \\
이러한 텍스트를 나타내는 문자열 리터럴은 다음과 같아야 "\\\\"
합니다.
그래서 우리는 \
두 번 탈출 했습니다.
- 정규식에서 한 번
\\
- 문자열 리터럴에서 한 번
"\\\\"
(각각 \
으로 "\\"
표시됨).
의 경우 replacement
\
도 특별합니다. 그것은 우리가 다른 특수 문자를 탈출 할 수 있습니다 $
통해 $x
표기법, 우리는 데이터의 부분은 정규식 일치와 같은 색인 캡처 그룹이 보유 사용할 수 있습니다 x
처럼, "012".replaceAll("(\\d)", "$1$1")
그룹 1을 포착 각 숫자와 일치합니다, 장소를하고 $1$1
두 개의 사본으로 대체됩니다 (복제) 결과 "001122"
.
다시 말하지만, 리터럴을 replacement
표현 \
하려면 추가로 이스케이프 처리해야 \
합니다.
- 교체는 두 개의 백 슬래시 문자를 포함해야합니다.
\\
\\
다음과 같이 나타내는 문자열 리터럴"\\\\"
그러나 우리는 두 개의 백 슬래시 replacement
를 유지 하기 를 원 하기 때문에 필요합니다 (각각 하나로 표시됨)."\\\\\\\\"
\
"\\\\"
따라서 버전 replaceAll
은 다음과 같이 보일 수 있습니다.
replaceAll("\\\\", "\\\\\\\\");
더 쉬운 방법
아웃하려면 생활 쉽게 자바는 자동으로 텍스트를 탈출 할 수있는 도구 제공 target
및 replacement
부품. 이제 우리는 문자열에만 집중할 수 있고 정규식 구문은 잊어 버릴 수 있습니다.
replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement))
우리의 경우에는
replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"))
더 나은
정규식 구문 지원이 실제로 필요하지 않으면 전혀 관여하지 마십시오 replaceAll
. 대신 replace
. 두 가지 방법 모두 대체합니다 모두 target
들,하지만 replace
정규 표현식 구문을 포함하지 않습니다. 그래서 당신은 간단히 쓸 수 있습니다
theString = theString.replace("\\", "\\\\");