Wildcard-Abgleich in Java

7

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?

    
Johannes Schaub - litb 21.06.2014, 02:11
quelle

6 Antworten

8

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: [^*]+|(\*)

  • Die linke Seite von | entspricht allen Zeichen, die kein Stern sind
  • Die rechte Seite erfasst alle Sterne in Gruppe 1
  • Wenn Gruppe 1 leer ist: Ersetzen durch \Q + Übereinstimmung + E
  • Wenn Gruppe 1 festgelegt ist: Ersetzen durch .*

Hier ist ein funktionierender Code (siehe die Ausgabe der Online-Demo ).

Eingabe: audio*2012*.wav

Ausgabe: \Qaudio\E.*\Q2012\E.*\Q.wav\E

%Vor%

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%     
zx81 21.06.2014, 02:24
quelle
13

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.

    
Bohemian 21.06.2014 02:19
quelle
4

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: Ссылка

    
Marek Gregor 13.04.2017 14:01
quelle
1

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:

%Vor%

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 (?)

    
Matt Coubrough 21.06.2014 02:28
quelle
0

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.

%Vor%     
Paul Jackson 03.11.2016 17:42
quelle
0

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%     
J. Hanney 21.12.2016 19:22
quelle

Tags und Links