Frage Liste aller Sonderzeichen, die in einer Regex maskiert werden müssen


Ich versuche, eine Anwendung zu erstellen, die eine Nachrichtenvorlage mit einer Nachricht übereinstimmt, die ein Benutzer senden möchte. Ich verwende Java Regex für den Abgleich der Nachricht. Die Vorlage / Nachricht kann Sonderzeichen enthalten.

Wie bekomme ich die vollständige Liste der Sonderzeichen, die maskiert werden müssen, damit meine Regex in den maximal möglichen Fällen funktioniert und übereinstimmt?

Gibt es eine universelle Lösung, um alle Sonderzeichen in Java-Regex zu umgehen?


75
2018-01-03 07:14


Ursprung


Antworten:


Sie können das Javadoc der Musterklasse betrachten: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

Sie müssen jedes dort aufgeführte Zeichen umgehen, wenn Sie das reguläre Zeichen und nicht die spezielle Bedeutung haben möchten.

Als eine vielleicht einfachere Lösung können Sie die Vorlage zwischen \ Q und \ E setzen - alles dazwischen wird als maskiert betrachtet.


62
2018-01-03 07:44



  • Java-Zeichen, die in regulären Ausdrücken maskiert werden müssen, sind:
    \.[]{}()<>*+-=?^$|
  • Zwei der schließenden Klammern (] und }) müssen nur nach dem Öffnen der gleichen Klammer gelöst werden.
  • Im []-bracket einige Zeichen (wie + und -) funktionieren manchmal ohne Flucht.

60
2017-10-07 05:03



Um zu entkommen, könntest du einfach diese verwenden Java 1.5:

Pattern.quote("$test");

Sie werden genau das Wort übereinstimmen $test


17
2018-05-13 18:02



Entsprechend der String Literale / Metazeichen Dokumentationsseite sind sie:

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

Es wäre auch cool, wenn diese Liste irgendwo im Code steht, aber ich weiß nicht, wo das sein könnte ...


14
2017-12-13 00:53



Auf @Sorins Vorschlag der Java-Pattern-Dokumentation sieht es aus, als wären zumindest die folgenden Zeichen zu entkommen:

\.[{(*+?^$|

5
2018-02-12 04:17



Ich kombiniere, was alle gesagt haben, und schlage folgendes vor, um die Liste der Zeichen für RegExp klar in ihrer eigenen Zeichenkette zu halten, und um zu vermeiden, dass sie versuchen müssen, Tausende von "\\" s zu analysieren. Das scheint mir ziemlich gut zu gehen:

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

4
2018-04-01 06:22



Auf der anderen Seite der Münze sollten Sie "non-char" regex verwenden, das so aussieht, wenn Sonderzeichen = allChars - number - ABC - Leerzeichen in Ihrem App-Kontext.

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

1
2018-01-03 07:39



Ich bin mir nicht sicher, ob ich deine Frage vollständig verstanden habe, aber ich denke, du solltest sie dir ansehen Matcher.quoteReplacement ()


0
2018-01-03 07:19