[java] 정규식에서 이스케이프해야하는 모든 특수 문자 목록

사용자가 보내려고하는 메시지와 메시지 템플릿을 일치시키는 응용 프로그램을 만들려고합니다. 메시지 일치를 위해 Java 정규식을 사용하고 있습니다. 템플릿 / 메시지에는 특수 문자가 포함될 수 있습니다.

내 정규식이 작동하고 가능한 최대 사례에서 일치하도록 이스케이프해야하는 특수 문자의 전체 목록을 어떻게 얻을 수 있습니까?

Java 정규식에서 모든 특수 문자를 이스케이프하기위한 범용 솔루션이 있습니까?



답변

Pattern 클래스의 javadoc을 볼 수 있습니다. http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

특별한 의미가 아닌 일반 문자를 원한다면 거기에 나열된 문자를 이스케이프해야합니다.

더 간단한 해결책으로 \ Q와 \ E 사이에 템플릿을 넣을 수 있습니다. 그 사이의 모든 것은 이스케이프 된 것으로 간주됩니다.


답변

  • 정규식에서 이스케이프해야하는 Java 문자는 다음과 같습니다.
    \.[]{}()<>*+-=!?^$|
  • 닫는 괄호 ( ]}) 중 두 개는 동일한 유형의 괄호를 연 후에 만 ​​이스케이프하면됩니다.
  • 에서 []-brackets 일부 문자가 (같은 +-) 탈출하지 않고 때로는 일을.

답변

탈출하려면 Java 1.5 에서 이것을 사용할 수 있습니다 .

Pattern.quote("$test");

당신은 단어를 정확하게 일치시킬 것입니다 $test


답변

String Literals / Metacharacters 문서 페이지 에 따르면 다음과 같습니다.

<([{\^-=$!|]})?*+.>

또한 그 목록을 코드의 어딘가에서 참조하는 것이 멋지지만 그게 어디인지 모르겠습니다 …


답변

모든 사람들이 말한 것을 결합하여 RegExp의 특수 문자 목록을 자신의 문자열에 명확하게 나열하고 수천 개의 “\\”를 시각적으로 구문 분석 할 필요가 없도록 다음을 제안합니다. 이것은 나를 위해 꽤 잘 작동하는 것 같습니다.

final String regExSpecialChars = "<([{\\^-=$!|]})?*+.>";
final String regExSpecialCharsRE = regExSpecialChars.replaceAll( ".", "\\\\$0");
final Pattern reCharsREP = Pattern.compile( "[" + regExSpecialCharsRE + "]");

String quoteRegExSpecialChars( String s)
{
    Matcher m = reCharsREP.matcher( s);
    return m.replaceAll( "\\\\$0");
}


답변

@Sorin의 Java Pattern 문서 제안에 따르면 이스케이프 할 문자는 최소한 다음과 같습니다.

\.[{(*+?^$|


답변

Pattern.quote(String s)의 종류는 당신이 원하는 않습니다. 그러나 그것은 조금 남았습니다. 실제로 개별 문자를 이스케이프하지 않고 문자열을 \Q...\E.

찾고있는 것을 정확히 수행하는 방법은 없지만, 좋은 소식은 Java 정규식에서 모든 특수 문자를 이스케이프하는 것이 실제로 매우 간단하다는 것입니다.

regex.replaceAll("[\\W]", "\\\\$0")

왜 이것이 작동합니까? 글쎄,에 대한 문서는 Pattern반드시 이스케이프 할 필요가없는 비 알파벳 문자를 이스케이프 할 수 있다고 명시합니다.

이스케이프 된 구조를 나타내지 않는 알파벳 문자 앞에 백 슬래시를 사용하는 것은 오류입니다. 정규 표현식 언어에 대한 향후 확장을 위해 예약되어 있습니다. 역 슬래시는 해당 문자가 이스케이프 처리되지 않은 구조의 일부인지 여부에 관계없이 알파벳이 아닌 문자 앞에 사용될 수 있습니다.

예를 ;들어은 정규식의 특수 문자가 아닙니다. 당신이 그것을 벗어날 경우, Pattern여전히 해석하는 것 \;;. 다음은 몇 가지 예입니다.

  • >다음 \>과 같다>
  • [진다 \[의 탈출 형태 인[
  • 8여전히 8입니다.
  • \)진다 \\\)(가)의 형태 인 이스케이프 \(연접.

참고 : 핵심은 문서에서 실제로 “비 단어 “문자 또는 문자 집합 밖에있는 문자를 의미하는 “알파벳이 아닌”의 정의입니다 [a-zA-Z_0-9].