이중 백 슬래시가있는 모든 단일 백 슬래시
나는 변환하기 위해 노력하고있어 String
\something\
에 String
\\something\\
사용 replaceAll
, 그러나 나는 모든 종류의 오류가 계속. 나는 이것이 해결책이라고 생각했다.
theString.replaceAll("\\", "\\\\");
그러나 이것은 아래 예외를 제공합니다.
java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
는 String#replaceAll()
A와 인수 해석 정규 표현식 . 은 \
에서 탈출 문자 모두 String
와 regex
. 정규식을 사용하려면 두 번 이스케이프해야합니다.
string.replaceAll("\\\\", "\\\\\\\\");
그러나 문자별로 정확하게 교체하고 패턴이 필요하지 않기 때문에 정규 표현식이 반드시 필요한 것은 아닙니다. 따라서 String#replace()
충분해야합니다.
string.replace("\\", "\\\\");
업데이트 : 주석에 따라 JavaScript 컨텍스트에서 문자열을 사용하려는 것으로 보입니다. StringEscapeUtils#escapeEcmaScript()
더 많은 캐릭터를 다루는 대신 더 나은 방법을 사용 하는 것이 좋습니다 .
이런 종류의 문제를 피하기 위해 (정규 표현식을 사용하는 replace
) 대신 replaceAll
( 일반 문자열을 사용)을 사용할 수 있습니다 . 여전히 백 슬래시를 이스케이프해야하지만 정규 표현식에 필요한 야생 방식은 아닙니다.
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
를 보유 하고 싶기 때문에 (각각 1로 표시됨)."\\\\\\\\"
\
"\\\\"
따라서 버전 replaceAll
은 다음과 같이 보일 수 있습니다.
replaceAll("\\\\", "\\\\\\\\");
더 쉬운 방법
아웃하려면 생활 쉽게 자바는 자동으로 텍스트를 탈출 할 수있는 도구 제공 target
및 replacement
부품. 이제 문자열에만 집중하고 정규식 구문을 잊어 버릴 수 있습니다.
replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement))
우리의 경우처럼 보일 수 있습니다
replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"))
더 나은
우리가 실제로 정규 표현식 구문을 필요로하지 않으면 전혀 관여하지 않아도됩니다 replaceAll
. 대신을 사용하십시오 replace
. 두 가지 방법 모두 대체합니다 모두 target
들,하지만 replace
정규 표현식 구문을 포함하지 않습니다. 그래서 당신은 단순히 쓸 수 있습니다
theString = theString.replace("\\", "\\\\");
You'll need to escape the (escaped) backslash in the first argument as it is a regular expression. Replacement (2nd argument - see Matcher#replaceAll(String)) also has it's special meaning of backslashes, so you'll have to replace those to:
theString.replaceAll("\\\\", "\\\\\\\\");
Yes... by the time the regex compiler sees the pattern you've given it, it sees only a single backslash (since Java's lexer has turned the double backwhack into a single one). You need to replace "\\\\"
with "\\\\"
, believe it or not! Java really needs a good raw string syntax.
'IT박스' 카테고리의 다른 글
독자 모나드의 목적은 무엇입니까? (0) | 2020.07.25 |
---|---|
Java .class 버전을 읽고 표시하는 도구 (0) | 2020.07.25 |
참조 된 어셈블리 PDB 및 XML 파일이 출력으로 복사되지 않도록 방지 (0) | 2020.07.25 |
정규식 : "문자열의 공백 또는 시작"및 "문자열의 공백 또는 끝"지정 (0) | 2020.07.25 |
자식 저장소에서 패치 또는 diff 파일을 만들어 다른 다른 자식 저장소에 적용하십시오. (0) | 2020.07.25 |