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$1
2개의 카피로 치환(복제)해, 그 결과, 다음과 같은 결과가 됩니다."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
단,replace
regex 구문은 포함되지 않습니다.그래서 당신은 간단하게 글을 쓸 수 있다.
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 |