Ich schreibe ein einfaches Debugging-Programm, das einfache Strings als Eingabe verwendet, die Sterne enthalten können, um eine Wildcard-Übereinstimmung anzuzeigen - Any
%Vor% Ich dachte, ich würde einfach dieses Muster nehmen, alle Sonderzeichen mit regulären Ausdrücken daraus entfernen und dann \*
zurück zu .*
ersetzen. Und dann verwenden Sie einen regulären Ausdruck Matcher.
Aber ich kann keine Java-Funktion finden, um einen regulären Ausdruck zu umgehen. Die beste Übereinstimmung, die ich finden konnte, ist Pattern.quote
, die aber am Anfang und am Ende der Zeichenfolge nur \Q
und \E
setzt.
Gibt es etwas in Java, das Ihnen erlaubt, einfach diesen Wildcard-Abgleich durchzuführen, ohne dass Sie den Algorithmus von Grund auf neu implementieren müssen?
Verwenden eines einfachen Regex
Einer der Vorteile dieser Methode ist, dass wir neben *
ganz einfach Token hinzufügen können (siehe Token hinzufügen unten).
Suche: [^*]+|(\*)
|
entspricht allen Zeichen, die kein Stern sind \Q
+ Übereinstimmung + E
.*
Hier ist ein funktionierender Code (siehe die Ausgabe der Online-Demo ).
Eingabe: audio*2012*.wav
Ausgabe: \Qaudio\E.*\Q2012\E.*\Q.wav\E
Hinzufügen von Token
Angenommen, wir möchten auch den Platzhalter ?
, der für ein einzelnes Zeichen steht, durch einen Punkt konvertieren. Wir fügen der Regex nur eine Erfassungsgruppe hinzu und schließen sie aus der Matchliste auf der linken Seite aus:
Suche: [^*?]+|(\*)|(\?)
In der Ersetzungsfunktion fügen wir etwas hinzu wie:
%Vor%Entkomme einfach alles - es wird kein Schaden daraus werden.
%Vor%Oder Sie können Zeichenklassen verwenden:
%Vor%Es ist einfacher, die Zeichen zu "entkommen", indem Sie sie in eine Zeichenklasse einfügen, da fast alle Zeichen in einer Zeichenklasse eine besondere Bedeutung verlieren. Wenn Sie keine merkwürdigen Dateinamen erwarten, funktioniert das.
Es gibt eine kleine Hilfsmethode in der Apache Commons-IO-Bibliothek: org.apache.commons.io.FilenameUtils # wildcardMatch (), die Sie ohne Feinheiten des regulären Ausdrucks verwenden können.
Die API-Dokumentation finden Sie in: Ссылка
Sie können auch die Notice-Escape-Zeichen verwenden: \Q and \E
- alles zwischen ihnen wird als Literal behandelt und nicht als Teil der auszuwertenden Regex betrachtet. Daher sollte dieser Code funktionieren:
Beachten Sie, dass Ihr * Platzhalter möglicherweise auch am besten nur mit Wortzeichen übereinstimmt, indem Sie \ w verwenden, je nachdem, wie sich Ihr Platzhalter verhalten soll (?)
Lucene verfügt über Klassen, die diese Fähigkeit bieten, mit zusätzlicher Unterstützung für Backslash als Escape-Zeichen. ?
entspricht einem einzelnen Zeichen, 1
entspricht 0 oder mehr Zeichen, \
entkommt dem folgenden Zeichen. Unterstützt Unicode-Codepunkte. Angeblich schnell, aber ich habe es nicht getestet.
Regex beim Aufnehmen eines DOS / Windows-Pfads
Das Implementieren der Anführungszeichen \Q
und \E
ist wahrscheinlich der beste Ansatz. Da ein Backslash jedoch normalerweise als DOS / Windows-Dateitrennzeichen verwendet wird, könnte eine " \E
" - Sequenz innerhalb des Pfades die Paarung von \Q
und \E
bewirken. Unter Berücksichtigung der Token für *
und ?
könnte diese Situation des Backslashs folgendermaßen behandelt werden:
Suche: [^*?\]+|(\*)|(\?)|(\)
Zwei neue Zeilen würden in der Ersetzungsfunktion des Beispiels "Using A Simple Regex" hinzugefügt, um das neue Suchmuster aufzunehmen. Der Code wäre immer noch "Linux-freundlich". Als eine Methode könnte es so geschrieben werden:
%Vor%Code zum Demonstrieren der Implementierung dieser Methode könnte folgendermaßen aussehen:
%Vor%Dies wären die generierten Ergebnisse:
%Vor%