Sonderzeichen in regulären Java-Ausdrücken maskieren

Gibt es in Java oder einer Open-Source-Bibliothek eine Methode, um ein Sonderzeichen (Metazeichen) zu maskieren (nicht in Anführungszeichen zu setzen), um es als regulären Ausdruck zu verwenden?

Dies wäre sehr praktisch, wenn Sie einen regulären Ausdruck dynamisch erstellen möchten, ohne jedes einzelne Zeichen manuell maskieren zu müssen.

Betrachten Sie zum Beispiel einen einfachen regulären Ausdruck wie\d+\.\d+ das entspricht Zahlen mit einem Komma wie1.2, sowie den folgenden Code:

String digit = "d";
String point = ".";
String regex1 = "\\d+\\.\\d+";
String regex2 = Pattern.quote(digit + "+" + point + digit + "+");

Pattern numbers1 = Pattern.compile(regex1);
Pattern numbers2 = Pattern.compile(regex2);

System.out.println("Regex 1: " + regex1);

if (numbers1.matcher("1.2").matches()) {
    System.out.println("\tMatch");
} else {
    System.out.println("\tNo match");
}

System.out.println("Regex 2: " + regex2);

if (numbers2.matcher("1.2").matches()) {
    System.out.println("\tMatch");
} else {
    System.out.println("\tNo match");
}

Es überrascht nicht, dass die vom obigen Code erzeugte Ausgabe wie folgt lautet:

Regex 1: \d+\.\d+
    Match
Regex 2: \Qd+.d+\E
    No match

Das ist,regex1 Streichhölzer1.2 aberregex2 (was "dynamisch" aufgebaut ist) stimmt nicht überein (stattdessen stimmt es mit der Literalzeichenfolge überein)d+.d+).

Gibt es also eine Methode, die automatisch jedem regulären Metazeichen entgeht?

Angenommen, es gäbe eine statische Aufladungescape() Methode injava.util.regex.Pattern, die Ausgabe von

Pattern.escape('.')

wäre die Zeichenfolge"\.", aber

Pattern.escape(',')

sollte nur produzieren",", da es sich nicht um ein Metazeichen handelt. Ähnlich,

Pattern.escape('d')

produzieren könnte"\d", schon seit'd' wird verwendet, um Ziffern zu bezeichnen (auch wenn in diesem Fall ein Escape-Zeichen möglicherweise keinen Sinn ergibt, wie z'd' könnte wörtlich bedeuten'd', was vom Regex-Interpeter nicht als etwas anderes missverstanden werden würde, wie es der Fall wäre'.').

Antworten auf die Frage(6)

Ihre Antwort auf die Frage