Gibt es eine Standardbibliothek (vorzugsweise Apache Commons oder eine ähnlich nicht virale Bibliothek), um Übereinstimmungen vom Typ "Glob" in Java durchzuführen? Als ich in Perl einmal Ähnliches tun musste, habe ich einfach alle " .
" in " \.
", die " *
" in " .*
" und die " ?
" in " .
" und so etwas geändert , aber ich frage mich, ob jemand das getan hat arbeite für mich.
Ähnliche Frage: Erstellen Sie einen regulären Ausdruck aus dem Glob-Ausdruck
Antworten:
Es ist nichts eingebaut, aber es ist ziemlich einfach, etwas Glob-ähnliches in einen regulären Ausdruck umzuwandeln:
Das funktioniert bei mir, aber ich bin mir nicht sicher, ob es den globalen "Standard" abdeckt, wenn es einen gibt :)
Update von Paul Tomblin: Ich habe ein Perl-Programm gefunden, das die Glob-Konvertierung durchführt und es an Java anpasst. Am Ende habe ich:
Ich bearbeite diese Antwort, anstatt meine eigene zu erstellen, weil diese Antwort mich auf den richtigen Weg gebracht hat.
quelle
Globbing ist
auch für dieImplementierung in Java 7 geplant.Siehe
FileSystem.getPathMatcher(String)
und das Tutorial "Dateien suchen" .quelle
Vielen Dank an alle hier für ihre Beiträge. Ich habe eine umfassendere Konvertierung geschrieben als jede der vorherigen Antworten:
Und das Gerät testet, um zu beweisen, dass es funktioniert:
quelle
Es gibt einige Bibliotheken, die Glob-ähnliche Mustervergleiche durchführen, die moderner sind als die aufgeführten:
Theres Ants Directory Scanner und Federn AntPathMatcher
Ich empfehle beides gegenüber den anderen Lösungen, da Ant Style Globbing in der Java-Welt (Hudson, Spring, Ant und ich denke Maven) so ziemlich zur Standard-Glob-Syntax geworden ist .
quelle
Ich musste es vor kurzem tun und benutzte
\Q
und\E
dem Glob-Muster entkommen:quelle
glob
Variable mit glob = Pattern.quote (glob) vorverarbeiten, was meiner Meinung nach solche Randfälle behandelt. In diesem Fall müssen Sie jedoch das erste und das letzte \\ Q und \\ E nicht voranstellen und anhängen.Dies ist eine einfache Glob-Implementierung, die * und? im Muster
quelle
Ähnlich wie Tony Edgecombe ‚s Antwort , hier ist eine kurze und einfache globber , dass Träger
*
und?
ohne regex, wenn jemand braucht.quelle
Es kann ein leicht hackiger Ansatz sein. Ich habe es aus dem NIO2-
Files.newDirectoryStream(Path dir, String glob)
Code herausgefunden. Achten Sie darauf, dass jedes passende neuePath
Objekt erstellt wird. Bisher konnte ich dies nur unter Windows FS testen, ich glaube jedoch, dass es auch unter Unix funktionieren sollte.UPDATE Funktioniert sowohl unter Mac als auch unter Linux.
quelle
Ich kenne keine "Standard" -Implementierung, aber ich kenne ein Sourceforge-Projekt, das unter der BSD-Lizenz veröffentlicht wurde und das Glob Matching für Dateien implementiert hat. Es ist in einer Datei implementiert , vielleicht können Sie es an Ihre Anforderungen anpassen.
quelle
Vor langer Zeit habe ich eine massive globgesteuerte Textfilterung durchgeführt, also habe ich ein kleines Stück Code geschrieben (15 Codezeilen, keine Abhängigkeiten über JDK hinaus). Es behandelt nur '*' (war für mich ausreichend), kann aber leicht für '?' Erweitert werden. Es ist um ein Vielfaches schneller als vorkompilierter regulärer Ausdruck und erfordert keine Vorkompilierung (im Wesentlichen handelt es sich jedes Mal um einen String-gegen-String-Vergleich, wenn das Muster übereinstimmt).
Code:
Verwendung:
Von hier aus kopieren / einfügen
quelle
Die vorherige Lösung von Vincent Robert / dimo414 basiert auf
Pattern.quote()
der Implementierung in Bezug auf\Q
...\E
, was nicht in der API dokumentiert ist und daher möglicherweise nicht für andere / zukünftige Java-Implementierungen der Fall ist. Die folgende Lösung beseitigt diese Implementierungsabhängigkeit, indem alle Vorkommen von\E
anstatt von verwendet werdenquote()
. Es aktiviert auchDOTALL
mode ((?s)
) für den Fall, dass die zuzuordnende Zeichenfolge Zeilenumbrüche enthält.quelle
Übrigens scheint es, als hätten Sie es in Perl auf die harte Tour gemacht
Dies macht den Trick in Perl:
quelle