답변:
이후 자바 1.5, 예 :
Pattern.quote("$5");
"mouse".toUpperCase().replaceAll("OUS","ic")
그것을 반환 MicE
합니다. 당신은 반환 할 것으로 예상 would't MICE
이 적용되지 않았기 때문에 toUpperCase()
에 ic
. 내 예에서는 인서트 quote()
에도 적용됩니다 . 다른 일을해야 할 수도 있고 아마도 효과 가 있을 수도 있지만 이는 직관이 아닙니다 . .*
replaceAll()
.replaceAll("*","\\E.*\\Q")
*.wav
정규식 패턴으로 \*\.wav
, 그리고 완전히 대체하기는으로 바꿀 것 \.*\.wav
을 것입니다 의미 이름이 임의의 수의 마침표와 그 뒤에 오는 파일로 구성됩니다 .wav
. replaceAll("\\*", ".*")
가능한 모든 정규식 charachter를 인식하고 개별적으로 이스케이프 처리하는 좀 더 취약한 구현을 수행 한 경우 가장 필요할 것입니다.
다음 예를보기 전에 차이점 Pattern.quote
과 Matcher.quoteReplacement
명확하지 않았습니다.
s.replaceFirst(Pattern.quote("text to replace"),
Matcher.quoteReplacement("replacement text"));
Pattern.quote
. | + () 등의 정규식 검색 문자열에서 Matcher.quoteReplacement
특수 문자를 대체하고 역 참조를 위해 \ 1과 같은 대체 문자열에서 특수 문자를 대체합니다.
quoteReplacement
두 심볼들에 대한 염려 만 $
하고 \
, 예를 들면 역 참조로서 대체 문자열에 사용될 수 $1
또는 \1
. 따라서 정규 표현식을 이스케이프하거나 인용하는 데 사용해서는 안됩니다.
$Group$
입니다 T$UYO$HI
. $
기호는 패턴 및 교체에 모두 특별하다 :"$Group$ Members".replaceFirst(Pattern.quote("$Group$"), Matcher.quoteReplacement("T$UYO$HI"))
당신이 쫓는 것은 \Q$5\E
입니다. Pattern.quote(s)
Java5에 도입 된 내용도 참조하십시오 .
세부 사항 은 패턴 javadoc을 참조하십시오.
먼저
끝에 1을 넣지 않습니다. 첫 번째 일치 그룹과 하위 THAT에 대한 검색 정규식을 살펴 봅니다. 대체 텍스트에서 $ 1, $ 2 또는 $ 3의 의미는 다음과 같습니다. 검색 패턴에서 일치하는 그룹.
긴 텍스트 문자열을 .properties 파일에 자주 연결 한 다음 전자 메일 제목과 본문을 생성합니다. 실제로 이것은 Spring Framework에서 i18n을 수행하는 기본 방법 인 것으로 보입니다. 자리 표시 자로 XML 태그를 문자열에 넣고 replaceAll ()을 사용하여 XML 태그를 런타임에 값으로 바꿉니다.
사용자가 달러 기호와 함께 달러와 센트 숫자를 입력하는 문제가 발생했습니다. replaceAll ()은 stracktrace에 다음과 같이 표시됩니다.
java.lang.IndexOutOfBoundsException: No group 3
at java.util.regex.Matcher.start(Matcher.java:374)
at java.util.regex.Matcher.appendReplacement(Matcher.java:748)
at java.util.regex.Matcher.replaceAll(Matcher.java:823)
at java.lang.String.replaceAll(String.java:2201)
이 경우 사용자가 입력에 어딘가에 "$ 3"을 입력하고 replaceAll ()이 검색 정규식에서 세 번째 일치 그룹을 찾은 후 찾지 못했습니다.
주어진:
// "msg" is a string from a .properties file, containing "<userInput />" among other tags
// "userInput" is a String containing the user's input
교체
msg = msg.replaceAll("<userInput \\/>", userInput);
와
msg = msg.replaceAll("<userInput \\/>", Matcher.quoteReplacement(userInput));
문제를 해결했다. 사용자는 문제없이 달러 기호를 포함한 모든 종류의 문자를 넣을 수 있습니다. 예상대로 정확하게 동작합니다.
패턴을 보호하기 위해 숫자와 문자를 제외한 모든 기호를 "\\\\"로 바꿀 수 있습니다. 그리고 나서이 보호 된 패턴에 특수 기호를 넣어이 패턴이 어리석은 인용 텍스트가 아니라 실제로 패턴 패턴처럼 작동하도록 만들 수 있습니다. 사용자 특수 기호가 없습니다.
public class Test {
public static void main(String[] args) {
String str = "y z (111)";
String p1 = "x x (111)";
String p2 = ".* .* \\(111\\)";
p1 = escapeRE(p1);
p1 = p1.replace("x", ".*");
System.out.println( p1 + "-->" + str.matches(p1) );
//.*\ .*\ \(111\)-->true
System.out.println( p2 + "-->" + str.matches(p2) );
//.* .* \(111\)-->true
}
public static String escapeRE(String str) {
//Pattern escaper = Pattern.compile("([^a-zA-z0-9])");
//return escaper.matcher(str).replaceAll("\\\\$1");
return str.replaceAll("([^a-zA-Z0-9])", "\\\\$1");
}
}
Pattern.quote ( "blabla")가 잘 작동합니다.
Pattern.quote ()가 잘 작동합니다. " \ Q "및 " \ E " 문자로 문장을 묶고 " \ Q "및 " \ E "를 이스케이프하는 경우 문장을 묶습니다 . 그러나 실제 정규 표현식 이스케이프 (또는 사용자 정의 이스케이프)를 수행 해야하는 경우이 코드를 사용할 수 있습니다.
String someText = "Some/s/wText*/,**";
System.out.println(someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));
이 메소드는 다음을 리턴합니다. Some / \ s / wText * / \, **
예제 및 테스트 코드 :
String someText = "Some\\E/s/wText*/,**";
System.out.println("Pattern.quote: "+ Pattern.quote(someText));
System.out.println("Full escape: "+someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));
\Q
and를 사용하여 줄 바꿈하지 마십시오\E
. 예를 위해이 예기치 않은 결과가 발생할 수 있습니다Pattern.quote("*.wav").replaceAll("*",".*")
발생합니다\Q.*.wav\E
하지.*\.wav
예상대로.