먼저 세 가지의 사용법을 요약하겠습니다.
・ 교체 (charsequence target, char equence servelication) , 모든 대상을 교체로 교체하십시오. 두 매개 변수는 문자열입니다.
preplaceall (String Regex, String Replacement) , 모든 정규식 일치를 교체로 교체하십시오. Regex는 분명히 정규 표현식이며 교체는 문자열입니다.
werlopfirst (String Regex, String Replacement) 는 기본적으로 replaceall과 동일합니다. 차이점은 첫 번째 일치 만 대체된다는 것입니다.
다음으로 소스 문자열의 a를 /a로 바꾸는 간단한 요구 사항이 있습니다. 코드는 다음과 같습니다.
System.out.println ( "Abac".replace ( "a", "// a")); //ab/acsystem.out.println("Abac".replaceall("a ","// a ")); //abacsystem.out.println("Abac".replacefirst("a ","// a ")); //abacsystem.out.println("Abac".replacefirst("a ","// a ")); // ABAC결과는 큰 놀라움이었습니다. 수년간의 교체 후, 나는 약간 혼란 스러웠다.
소스 문자열은 "Abac"이며 "A"를 찾아 /A로 바꿉니다. /a exceate이기 때문에 /a를 표현하려면 "// a"를 써야합니다. 첫 번째 백 슬래시는 두 번째 백 슬래시를 일반 문자열로 빠져냅니다.
3 개의 교체 표현식을 사용하면 첫 번째 교체 기능의 결과 만 정확합니다. 문제는 무엇입니까?
replaceall 및 replicefirst는 첫 번째 매개 변수가 정규식이어야합니다. "A"는 문자열 A와 일반 표현식 A로 이해 될 수 있으므로 첫 번째 매개 변수는 정상입니다.
문제는 두 번째 매개 변수에 있습니다. 독자가 교체 기능의 의견을 신중하게 읽으면 다음과 같은 설명을 찾을 수 있습니다.
교체 문자열의 백 슬래시 (/) 및 달러 표시 ($)는 문자 그대로 교체 문자열로 취급되는 경우와 다른 결과가 다른 결과를 초래할 수 있습니다. Matcher.Replaceall을 참조하십시오. 원하는 경우 java.util.regex.matcher.quotereplacement를 사용하여 이러한 문자의 특별한 의미를 억제하십시오.
replaceall 및 replicefirst의 첫 번째 매개 변수는 규칙적이므로 요구 사항과 같은 두 번째 매개 변수에서 작은 트릭을 만들 수 있습니다. 소스 문자열의 a를 다음 문자로 바로 바꾸면 코드는 다음과 같습니다.
System.out.println ( "Abac".replaceall ( "a (// w)", "$ 1 $ 1")); //bbccsystem.out.println("Abac".replacefirst("a(//w) ","$ 1 $ 1 ")); // BBAC규칙 성의 의미를 독자가 이해할 수 있다고 가정하면, 두 번째 매개 변수에서 $ 기호를 사용하여 그룹의 내용을 얻을 수 있음을 알 수 있습니다. 이 예에서 $ 1은 첫 번째 그룹의 내용, 즉 다음 캐릭터의 내용을 얻는 데 사용됩니다.
따라서 $ 기호는 두 번째 매개 변수에 특별한 의미를 가지며 무작위로 작성하면 오류가 발생합니다.
System.out.println ( "abac".replaceall ( "a (// w)", "$")); // 스레드의 예외 "main"java.lang.stringIndexOutOfBoundSexception : 범위에서 문자열 인덱스 : 1
단지 $로 교체하고 싶다면 어떻게해야합니까? 이를 위해서는 캐릭터를 피해야합니다.
System.out.println ( "Abac".replaceall ( "a", "// $")); // $ b $ c
이 시점에서 독자들은 갑자기 백 슬래시가 두 번째 매개 변수에 특별한 의미 (탈출)를 가지고 있음을 갑자기 깨달을 수 있으므로 백 슬래시를 표현하려면 다시 탈출해야합니다.
System.out.println ( "abac".replaceall ( "a", "/// a")); //ab/acsystem.out.println("Abac".replacefirst("a ","//// a ")); /// Abac간단히 이해하려면 "/// a"의 전면 백 슬래시는 후방 슬래시를 피하여 후방 슬래시가 일반 문자열이되도록합니다. 이런 식으로, Java 메모리에 보이는 문자열은 "// a"입니다. 처리 할 때, replaceall 함수는 전면 백 슬래시를 사용하여 후방 슬래시를 피하기 위해 후방 슬래시가 $를 피하는 데 사용되지 않는 일반적인 문자열이며, 메모리의 최종 문자열은 " /a"이므로 /a로 성공적으로 대체 될 수 있습니다.
요약
탈출 문제는 실제로 얽혀 있습니다. 이 기사를 통해 저자는 미래에 이러한 기능을 사용할 때 독자가 깨어있을 수 있기를 희망하며 매개 변수의 특수 문자를 알고 시한 폭탄을 쓰지 않기를 희망합니다. 위는이 기사의 전체 내용입니다. 모든 사람의 연구와 일에 도움이되기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다.