2014-10-08 3 views
0

문자열을 $ 기호로 바꾸는 것이 효과적이지 않은 것으로 알고 있는데 String.replaceAll(String, String)을 사용하고있었습니다. 예 $REPLACEME$은 Linux 시스템에서 대체되지 않습니다. 누구나 이것이 왜 있는지 압니까?Java replaceAll

일부 코드 :

String foo = "Some string with $REPLACEME$"; 
foo = foo.replaceAll("$REPLACEME$", "characters"); 
System.out.println(foo); 

출력 :

foo = foo.replaceAll("\\$REPLACEME\\$", "characters"); 

또는 더 일반적으로는 모두 탈출 할 Pattern.quote를 사용

Some string with $REPLACEME$ 
+2

왜 당신은'replace'보다는'replaceAll'을 사용하고 있습니까? 정규 표현식이 필요합니까? –

답변

5

$ 이스케이프 할 필요가있는 특수 문자 메타 문자 (과 같은 특수 문자 문자열 상수로 197,및 ?)

foo = foo.replaceAll(Pattern.quote("$REPLACEME$"), "characters"); 
+0

왜 탈출해야합니까? – TameHog

+2

[정규 표현식 구문] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html)에서 행의 끝을 의미합니다. 그래서 당신의 문자열의 시작 부분에 문자열의 끝이 없다면 ... –

+3

+1'Pattern.quote'에 대해, 나는 이미 답을 고민하고있었습니다. –

3

replaceAll는 첫 번째 인수로서 정규 표현식을 사용한다. $ 정규식에 일치하는 문자열의 끝이 너무

foo = foo.replaceAll("\\$REPLACEME\\$", "characters"); 
+1

순수 정규 표현식에서 리터럴 달러 기호는 이스케이프 처리 된'\ $'이어야하지만 자바에서는 이스케이프 문자가 이스케이프되어야하므로'\\ $'입니다. – Gary

3

replaceAll 방법 regular expressions 사용 탈출해야 일치 앵커 문자이고 $ 문자의 끝을 나타내는 일반 식 메타 문자 끈. 그러나 replace 메서드는 대상 문자열의 모든 인스턴스를 대체 문자열로 바꿔 정규 표현식이 아닌 일반 문자열을 사용합니다. 이것은 당신이 기대하고있는 것을 할 것입니다 :

String foo = "Some string with $REPLACEME$"; 
foo = foo.replace("$REPLACEME$", "characters"); 
System.out.println(foo);