2015-01-15 3 views
0

다음은 replaceAll 메소드로 예상 결과를 제공하지 않는 프로그램입니다. java 문자열에서 replaceAll 메소드가 예상 결과를 제공하지 않음

public class HelloWorld{ 
    public static void main(String []args){ 
     String source = "Stack Overflow is a question and answer (site) for professional."; 
     String txt1 = "question and answer (site) for"; 
     String text2 = "changed question and answer (site) for"; 
     source = source.replaceAll(txt1, text2); 
     System.out.println(source); 
    } 
} 

나는 단어에 대한 소스, 텍스트 1과 텍스트 2에 괄호 (즉 괄호)를 제거하면

는 "사이트"가 적절한 결과를주고있다. 어떤 문제로 인해 어떤 일이 일어날 수 있습니까?

+1

문자열이 동적 인 경우를 당신이 다음 정규 표현식 매칭하려면 string.replace 필요하지 않습니다 (더 "모든"없음) 작동해야합니다 - 내 대답을 참조하십시오. – laune

답변

3

괄호는 그룹화에 사용됩니다. 그들이 문자 그대로 되길 원한다면,

String txt1 = "question and answer \\(site\\) for"; 

이것은 대체 문자열이 아닌 패턴에만 적용됩니다.

와일드 카드를 사용하는 경우 일치하는 문자열의 일부에 액세스하기 위해 정규식에서 그룹화가 사용됩니다.

"abc(\\d+)def" 

이렇게하면 경기가 끝난 후 중간 부분과 일치하는 숫자를 결정할 수 있습니다.

은 또는 당신은 어떤 정규식 마법없이

source = source.replace(txt1, text2); 

를 사용합니다. (여전히 모든 발생을 대체합니다.)

+0

예. " '대체하기'를 사용하는 것이이 질문에 대한 올바른 대답입니다. – khelwood

5

replaceAll 메서드는 arguements로 정규 표현식을 사용합니다. 그리고 괄호는 정규 표현식에서 사용되는 문자이므로 직접 인식되지 않습니다. 리터럴 문자열을 얻으려면 Pattern.quote을 사용할 수 있습니다.

+1

괄호를 이스케이프 처리한다고 생각합니다. (즉'\ ('또는'\)'도 작동합니다.) – MadConan

+2

왜 String.replace가있을 때 Pattern.quote입니까? – laune

+0

@laune을 가리켜 주셔서 감사합니다. . 정확한 솔루션을 제공하는 대신 그냥 문제의 원인을 지적하고 싶었습니다 – stinepike

-1

일반 문자열을 바꾸고 정규식을 전혀 사용하지 않는 경우 괄호를 변경할 필요가 없습니다. 가 대신 그냥 자바가 같은 검색 문자열에 Pattern.quote를 사용하는 모든 특수 문자를 탈출하자

public class HelloWorld{ 
    public static void main(String []args){ 
     String source = "Stack Overflow is a question and answer (site) for professional."; 
     String txt1 = "question and answer (site) for"; 
     String text2 = "changed question and answer (site) for"; 
     source = source.replaceAll(Pattern.quote(txt1), text2); 
     System.out.println(source); 
    } 
} 
+1

문자열이있는 경우 왜 Pattern.quote입니까? replace – laune

+0

예, 정확합니다. Pattern.quote는 정규 표현식 옆에 부분 문자열을 작성하는 측면에서 더 적합합니다. –

관련 문제