2011-02-26 2 views
3

더 큰 정규 표현식 내부에서 리터럴 문자열로 취급되는 문자열을 인용하고 그 표현식이 POSIX Extended Regular Expressions 형식을 준수해야합니다.POSIX 확장 형식의 Java에서 정규식 텍스트를 이스케이프 처리하는 방법

이 질문은, this existing question 매우 유사하지만 그것이 내가 특별한 \Q\E 마크에 의존하는 Pattern.quote()를 사용 제안하기 때문에 대답은 나를 거기에 만족하지 않습니다 - 그 자바 정규 표현식에 의해 지원되지만 하지가 준수 할 POSIX 확장 형식으로 변환합니다.

예를 들어 one.twoone\.two이 아니고 \Qone.two\E이 아니게하려고합니다. 이 라인을 따라

답변

2

브라이언에 의해 대답은 "one.two"와 테스트

String toBeEscaped = "\\{}()[]*+?.|^$"; 
return inString.replaceAll("[\\Q" + toBeEscaped + "\\E]", "\\\\$0"); 

단순화 할 수있다.

+0

그것은 한 문자로만 작동한다. –

+0

당신은 그것을 어떻게 의미합니까? 그것은 내가 할 수있는 모든 예들에게 적용됩니다. – maaartinus

+0

@Sean : 한 번에 한 문자 *를 대체하지만,'replaceAll()'은 문자열의 모든 문자를 반복합니다. 하지만 그 한 문자를 대체하기 위해 엄청난 양의 코드가 필요합니다. 나는 항상 Brian의 방법대로 해왔다. * 읽기 쉽다. –

3

아마 뭔가가 :

// untested 
String escape(String inString) 
{ 
    StringBuilder builder = new StringBuilder(inString.length() * 2); 
    String toBeEscaped = "\\{}()[]*+?.|^$"; 

    for (int i = 0; i < inString.length(); i++) 
    { 
     char c = inString.charAt(i); 

     if (toBeEscaped.contains(c)) 
     { 
      builder.append('\\'); 
     } 

     builder.append(c); 
    } 

    return builder.toString(); 
} 
+0

메서드 이름은 소문자 여야합니다. C#이 아닙니다. 그렇지 않다면 : +1 –

+0

@ 샌프란 패트릭 : 요즘, 나는 많은 자바를 쓰지 않는다 : –

관련 문제