sourcecode

String.replace모든 단일 백슬래시를 이중 백슬래시로 바꿉니다.

copyscript 2022. 9. 22. 00:12
반응형

String.replace모든 단일 백슬래시를 이중 백슬래시로 바꿉니다.

저는 이 모든 것들을 시도하고 있습니다.String \something\String \\something\\사용.replaceAll그런데 계속 여러 가지 오류가 발생해요.난 이게 해결책이라고 생각했어

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

단, 다음과 같은 예외가 있습니다.

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

는 인수를 정규 표현으로 해석합니다.\ 다 이스케이프 캐릭터입니다. String그리고.regex. regex를 위해 이중 이스케이프를 해야 합니다.

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

단, 이 경우 regex가 반드시 필요한 것은 아닙니다.단, 정확한 문자별 치환을 원하기 때문에 패턴은 필요하지 않습니다.이것으로 충분합니다.

string.replace("\\", "\\\\");

업데이트: 코멘트대로 JavaScript 컨텍스트에서 문자열을 사용하고 싶은 것 같습니다.더 많은 캐릭터를 커버하기 위해 사용하는 것이 좋을지도 모릅니다.

TLDR: 사용theString = theString.replace("\\", "\\\\");대신.


문제

replaceAll(target, replacement)는 정규 표현(regex) 구문을 사용합니다.target그리고 부분적으로는replacement.

문제는 말이다\regex의 특수 문자입니다(이 문자는 다음과 같이 사용할 수 있습니다).\d숫자를 나타내다) 및 String 리터럴(와 같이 사용할 수 있습니다."\n"줄 구분자를 나타냅니다.\"일반적으로 문자열 리터럴의 끝을 나타내는 큰따옴표 기호를 이스케이프합니다).

이 두 경우 모두 작성해야 합니다.\기호 추가 배치로 탈출할 수 있습니다(특수 문자 대신 문자 그대로 사용).\그 전에 (우리가 도망치듯이)"을 통해 문자열 리터럴로\").

그래서target나타내는 정규식\기호는 유지되어야 합니다.\\이러한 텍스트를 나타내는 문자열 리터럴은 다음과 같이 표시되어야 합니다."\\\\".

그래서 우리는 탈출했다.\2회:

  • 정규식에 한 번\\
  • String 리터럴에 한 번 입력"\\\\"(각각\로 표현된다."\\").

의 경우replacement \거기에서도 특별해요.그것은 우리가 다른 특수 캐릭터로부터 벗어날 수 있게 해준다.$어느쪽을 통해서$x표기법, regex에 의해 매칭되고 인덱스된 그룹을 캡처하여 보유되는 데이터의 일부를 사용할 수 있습니다.x,맘에 들다"012".replaceAll("(\\d)", "$1$1")각 숫자와 일치하여 캡처 그룹1에 배치하고$1$12개의 카피로 치환(복제)해, 그 결과, 다음과 같은 결과가 됩니다."001122".

다시 한 번 말씀드리지만replacement대표하다\문자 그대로 우리는 그것을 탈출할 필요가 있다\즉, 다음과 같습니다.

  • 교체에는 두 개의 백슬래시가 있어야 합니다.\\
  • 및 스트링 리터럴은\\처럼 보인다"\\\\"

하지만 우리가 원하니까replacement두 개의 백슬래시를 잡기 위해"\\\\\\\\"(각각\1로 대표되다"\\\\").

그럼 버전 설정replaceAll처럼 보일 수 있다

replaceAll("\\\\", "\\\\\\\\");

쉬운 방법

생활을 쉽게 하기 위해 Java는 자동으로 텍스트를 이스케이프하는 도구를 제공합니다.target그리고.replacement이제 string에만 집중할 수 있고 regex 구문은 생략할 수 있습니다.

replaceAll(Pattern.quote(target), Matcher.quoteReplacement(replacement))

우리의 경우엔 이런 식으로 보일 수 있습니다.

replaceAll(Pattern.quote("\\"), Matcher.quoteReplacement("\\\\"))

더 좋다

regex 구문 지원이 실제로 필요하지 않은 경우,replaceAll조금도.대신,replace. 두 가지 방법으로 모두 대체됩니다. target단,replaceregex 구문은 포함되지 않습니다.그래서 당신은 간단하게 글을 쓸 수 있다.

theString = theString.replace("\\", "\\\\");

이러한 문제를 피하기 위해replace스트링을 사용) ( 스트링을 사용)replaceAll(일부러)여전히 백슬래시를 회피해야 하지만 정규 표현에서 요구되는 거친 방법은 아닙니다.

첫 번째 인수는 정규 표현이므로 백슬래시는 피할 필요가 있습니다.치환(두 번째 인수 - Matcher#replaceAll(String) 참조)은 백슬래시의 특별한 의미도 있으므로 다음과 같이 치환해야 합니다.

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

가 사용자가을 볼 때 볼 수 (Java의에). 정규식 컴파일러가 당신이 준 패턴을 볼 때쯤에는 하나의 백슬래시만 볼 수 있습니다(Java의 렉서가 이중 백백을 단일 백슬래시로 변환했기 때문에). 바꿔서 돼요."\\\\""\\\\"string 에 매우 합니다.Java java java java java java java java java java java java java java java java.

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

반응형