Java에서 replace, replaceAll, replaceFirst 함수의 사용법 소결
• replace(CharSequence target, CharSequence replacement), 모든 target을 replacement로 대체합니다. 두 매개 변수는 문자열입니다.
/replace All (String regex, String replacement), replacement로 모든 regex 일치 항목을 대체합니다. regex는 정규 표현식입니다. replacement는 문자열입니다.
・replaceFirst(String regex, String replacement), 기본은 ReplaceAll과 같고, 차이점은 첫 번째 일치 항목만 바꾸는 것입니다.
다음은 원본 문자열의 a를\a로 바꾸는 간단한 요구가 있습니다. 코드는 다음과 같습니다.
System.out.println("abac".replace("a", "\\a")); //\ab\ac
System.out.println("abac".replaceAll("a", "\\a")); //abac
System.out.println("abac".replaceFirst("a", "\\a")); //abac
결과는 사람을 깜짝 놀라게 했다. 이렇게 여러 해 동안 교체를 했는데 뜻밖에도 좀 어리둥절해졌다.원본 문자열은 "abac"입니다. 그리고 "a"를 찾아서\a로 바꿉니다.\a는 자바 전의 문자이기 때문에\a를 표현하려면 "\a"라고 써야 합니다. 첫 번째 반사선은 두 번째 반사선을 일반 문자열로 바꿉니다.
세 개의 대체 표현식은 첫 번째 Replace 함수의 결과만 정확합니다. 문제는 어디에 있습니까?
replace All과replaceFirst는 첫 번째 매개 변수가 정규 표현식이라고 요구합니다.'a'는 문자열 a도 이해할 수 있고 정규 표현식 a도 이해할 수 있기 때문에 첫 번째 매개 변수는 문제없습니다.
문제는 두 번째 매개 변수에서 나온다. 만약에 독자가 ReplaceAll 함수의 주석을 자세히 읽으면 다음과 같은 설명이 있을 것이다.
Note that backslashes (\) and dollar signs ($) in the replacement string may cause the results to be different than if it were being treated as a literal replacement string; see Matcher.replaceAll. Use java.util.regex.Matcher.quoteReplacement to suppress the special meaning of these characters, if desired.
replace All과replaceFirst의 첫 번째 매개 변수는 정규이기 때문에 우리는 두 번째 매개 변수에서 작은 양식을 만들 수 있다. 예를 들어 이런 수요가 있다. 원본 문자열의 a를 a 뒤에 가까운 문자로 바꾸면 코드는 다음과 같다.
System.out.println("abac".replaceAll("a(\\w)", "$1$1")); //bbcc
System.out.println("abac".replaceFirst("a(\\w)", "$1$1")); //bbac
정규의 의미는 독자가 읽을 수 있다고 가정하면 두 번째 매개 변수에서 $기호로 그룹의 내용을 얻을 수 있음을 알 수 있다. 이 예에서 $1로 첫 번째 그룹의 내용, 즉 a 뒤에 인접한 문자를 얻었다.따라서 $기호는 두 번째 매개변수에서 특별한 의미를 가지며 낙서하면 오류가 발생합니다.
System.out.println("abac".replaceAll("a(\\w)", "$")); //Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
그럼 만약에 내가 $로 바꾸고 싶다면?이 경우 이스케이프 문자가 필요합니다.
System.out.println("abac".replaceAll("a", "\\$")); //$b$c
이렇게 되면 독자들은 문득 반사선이 두 번째 매개 변수에도 특수한 의미(전의)가 있다는 것을 크게 깨닫게 될 것이다. 그래서 만약에 우리가 반사선을 표현하려면 반드시 다시 한 번 뜻을 바꿔야 한다.
System.out.println("abac".replaceAll("a", "\\\\a")); //\ab\ac
System.out.println("abac".replaceFirst("a", "\\\\a")); //\abac
간단히 이해하자면 "\\\\a"에서 앞부분의 반사선은 뒷부분의 반사선을 각각 뜻하고 뒤부분의 반사선은 일반 문자열이다. 이렇게 하면 자바 메모리에서 보이는 문자열은 "\a"이다. 그리고 Replace All 함수는 처리할 때 앞부분의 반사선으로 뒷부분의 반사선을 뜻하게 하고 뒤부분의 반사선은 일반 문자열이다. $를 뜻하지 않고 최종 메모리의 문자열은 "\a"이다.이렇게 해야만 a를\a로 성공적으로 대체할 수 있습니다.총결산
전의의 문제는 확실히 얽혀 있다. 본고를 통해 필자는 독자가 앞으로 이런 함수를 사용할 때 정신을 차리고 파라미터 중의 특수한 문자를 의식하여 시한폭탄을 쓰지 않기를 바란다.이상은 이 글의 전체 내용입니다. 여러분의 학습과 업무에 도움이 되고 궁금한 점이 있으면 댓글을 남겨 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.