사용자가 보내려고하는 메시지와 메시지 템플릿을 일치시키는 응용 프로그램을 만들려고합니다. 메시지 일치를 위해 Java 정규식을 사용하고 있습니다. 템플릿 / 메시지에는 특수 문자가 포함될 수 있습니다.
내 정규식이 작동하고 가능한 최대 사례에서 일치하도록 이스케이프해야하는 특수 문자의 전체 목록을 어떻게 얻을 수 있습니까?
Java 정규식에서 모든 특수 문자를 이스케이프하기위한 범용 솔루션이 있습니까?
답변
Pattern 클래스의 javadoc을 볼 수 있습니다. http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
특별한 의미가 아닌 일반 문자를 원한다면 거기에 나열된 문자를 이스케이프해야합니다.
더 간단한 해결책으로 \ Q와 \ E 사이에 템플릿을 넣을 수 있습니다. 그 사이의 모든 것은 이스케이프 된 것으로 간주됩니다.
답변
- 정규식에서 이스케이프해야하는 Java 문자는 다음과 같습니다.
\.[]{}()<>*+-=!?^$|
- 닫는 괄호 (
]
및}
) 중 두 개는 동일한 유형의 괄호를 연 후에 만 이스케이프하면됩니다. - 에서
[]
-brackets 일부 문자가 (같은+
과-
) 탈출하지 않고 때로는 일을.
답변
답변
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]
.