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
'sourcecode' 카테고리의 다른 글
| Galera 클러스터에서는 놀라울 정도로 낮은 퍼포먼스 (0) | 2022.09.22 |
|---|---|
| MySQL에서 테이블 이름이 변수인 경우 선택하는 방법 (0) | 2022.09.22 |
| 여러 파일에 걸쳐 구성된 Python 클래스를 사용할 수 있습니까? (0) | 2022.09.22 |
| SpringBoot2 구성 JUQ MariaDB: "javax.sql 유형의 빈이 필요했습니다.DataSource'를 찾을 수 없습니다." (0) | 2022.09.22 |
| 변수 앞에 더하기 기호가 있는 목적은 무엇입니까? (0) | 2022.09.22 |