IT박스

이중 백 슬래시가있는 모든 단일 백 슬래시

itboxs 2020. 7. 25. 10:44
반응형

이중 백 슬래시가있는 모든 단일 백 슬래시


나는 변환하기 위해 노력하고있어 String \something\String \\something\\사용 replaceAll, 그러나 나는 모든 종류의 오류가 계속. 나는 이것이 해결책이라고 생각했다.

theString.replaceAll("\\", "\\\\");

그러나 이것은 아래 예외를 제공합니다.

java.util.regex.PatternSyntaxException: Unexpected internal error near index 1

String#replaceAll()A와 인수 해석 정규 표현식 . \에서 탈출 문자 모두 Stringregex. 정규식을 사용하려면 두 번 이스케이프해야합니다.

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("\\\\", "\\\\\\\\");

더 쉬운 방법

아웃하려면 생활 쉽게 자바는 자동으로 텍스트를 탈출 할 수있는 도구 제공 targetreplacement부품. 이제 문자열에만 집중하고 정규식 구문을 잊어 버릴 수 있습니다.

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.

참고URL : https://stackoverflow.com/questions/1701839/string-replaceall-single-backslashes-with-double-backslashes

반응형