source

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

goodcode 2022. 10. 26. 22:17
반응형

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

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

regex가 동작하고 가능한 한 일치시키기 위해 이스케이프해야 하는 특수문자의 전체 목록을 얻으려면 어떻게 해야 합니까?

Java regex에서 모든 특수 문자를 이스케이프할 수 있는 범용 솔루션이 있습니까?

  • 정규 표현으로 이스케이프해야 하는 Java 문자는 다음과 같습니다.
    \.[]{}()<>*+-=!?^$|
  • 2개의 클로징브래킷(]그리고.})는, 같은 타입의 브래킷을 연 후에만 이스케이프 할 필요가 있습니다.
  • []- 일부 문자(예:+그리고.-)는 탈출하지 않고 작업할 수 있습니다.

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

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

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

Java 1.5에서 다음 명령을 사용하면 탈출할 수 있습니다.

Pattern.quote("$test");

너는 그 단어와 정확히 일치할 것이다.$test

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

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

그리고 그 목록을 코드 어딘가에서 심사하는 것도 좋지만 그게 어디 있을지...

모두의 말을 종합하면, RegExp에 특화된 문자 목록을 자신의 String에 명확하게 기재하고 수천 개의 "\"를 시각적으로 해석할 필요가 없도록 하기 위해 다음과 같이 제안합니다.이것은 나에게 꽤 효과가 있는 것 같다.

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");
}

Java용이지만 코드는 제가 생각해낸 이 Kotlin String 확장자(제공된 @brcolow에서 채택)에서 쉽게 적응할 수 있습니다.

private val escapeChars = charArrayOf(
    '<',
    '(',
    '[',
    '{',
    '\\',
    '^',
    '-',
    '=',
    '$',
    '!',
    '|',
    ']',
    '}',
    ')',
    '?',
    '*',
    '+',
    '.',
    '>'
)

fun String.escapePattern(): String {
    return this.fold("") {
      acc, chr ->
        acc + if (escapeChars.contains(chr)) "\\$chr" else "$chr"
    }
}

fun main() {
    println("(.*)".escapePattern())
}

인쇄하다\(\.\*\)

동작 확인은 이쪽 https://pl.kotl.in/h-3mXZkNE 에서 실시합니다.

Java Pattern 문서에 대한 @Sorin의 제안에 따르면 이스케이프 문자에는 적어도 다음과 같은 문자가 있습니다.

\.[{(*+?^$|

Pattern.quote(String s)네가 하고 싶은 대로 하는 거야다만, 조금 아쉬운 점이 있습니다.실제로 개개의 문자를 벗어나는 것이 아니라, 스트링을 로 감싸는 것 뿐입니다.\Q...\E

원하는 대로 실행하는 방법은 없지만 Java 정규 표현에서 특수 문자를 모두 이스케이프하는 것은 매우 간단하다는 것이 장점입니다.

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

이게 왜 작동하죠?에 대한 설명서에 따르면 반드시 이스케이프할 필요가 없는 알파벳 이외의 문자를 이스케이프할 수 있습니다.

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

를 들어, 「」라고 하는 것은,;정규 표현에서 특수 문자는 아닙니다.만약에 되면,Pattern 해석할 것이다\; as ~하듯이;. 다음은 몇 가지 예가 있습니다.다음은 몇 가지 예를 제시하겠습니다.

  • >다가 되다\> which is equivalent to 와 동등하다.>
  • [다가 되다\[ which is the escaped form of 이것은 탈출한 형태이다.[
  • 8 is still 정지해 있다8....
  • \)다가 되다\\\) which is the escaped forms of 탈옥한 형태입니다\ and 그리고.(성질하다.접속되어 있습니다.

주의: 여기서 중요한 것은 "비알파벳"의 정의입니다.이 문서는 실제로 "비알파벳" 문자 또는 문자 집합 이외의 문자를 의미합니다.[a-zA-Z_0-9]

동전의 반대편에는 앱 컨텍스트에서 특수 문자 = allChars - number - ABC - space일 경우 다음과 같은 "non-char" 정규식을 사용해야 합니다.

String regepx = "[^\\s\\w]*";

Java regex가 사용하는 이스케이프 문자 목록을 신뢰하고 있는 경우(이러한 문자가 일부 패턴클래스 멤버에서 공개되어 있으면 좋을 것 같습니다), 실제로 필요한 경우 다음 방법을 사용하여 문자를 이스케이프할 수 있습니다.

private static final char[] escapeChars = { '<', '(', '[', '{', '\\', '^', '-', '=', '$', '!', '|', ']', '}', ')', '?', '*', '+', '.', '>' };

private static String regexEscape(char character) {
    for (char escapeChar : escapeChars) {
        if (character == escapeChar) {
            return "\\" + character;
        }
    }
    return String.valueOf(character);
}

언급URL : https://stackoverflow.com/questions/14134558/list-of-all-special-characters-that-need-to-be-escaped-in-a-regex

반응형