Regulärer Ausdruck nur die erste Datei in einem RAR-Datei Satz übereinstimmen
Frage
Um zu sehen, welche Datei die unrar Befehl aufzurufen auf, man braucht, um zu bestimmen, welche Datei die erste in der Datei festgelegt ist.
Hier sind einige Beispiele für Dateinamen, von denen einer - natürlich - nur die erste Gruppe abgestimmt werden sollte:
yes.rar
yes.part1.rar
yes.part01.rar
yes.part001.rar
no.part2.rar
no.part02.rar
no.part002.rar
no.part011.rar
Ein (haftungsbeschränkt), wie es mit PCRE kompatibel regexps zu tun, ist dies:
.*(?:(?<!part\d\d\d|part\d\d|\d)\.rar|\.part0*1\.rar)
Das hat in Ruby nicht, wenn ich es auf Rejax jedoch.
Wie würden Sie schreiben einen Ruby-kompatibel regulären Ausdruck nur die erste Datei in einem Satz von RAR-Dateien übereinstimmen?
Lösung
Die kurze Antwort ist, dass es nicht möglich ist, einen einzigen regulären Ausdruck zu konstruieren, Ihr Problem zu befriedigen. Ruby 1.8 nicht Lookarounds Behauptungen hat (das (?
1) Verwenden Sie mehr als einen regulären Ausdruck, es zu tun.
def is_first_rar(filename)
if ((filename =~ /part(\d+)\.rar$/) == nil)
return (filename =~ /\.rar$/) != nil
else
return $1.to_i == 1
end
end
2) Mit der regulären Ausdruck-Engine für Ruby 1.9 Oniguruma . Es unterstützt Lookarounds Behauptungen, und Sie können installieren Sie es als ein Juwel für Ruby 1.8 . Danach können Sie etwas tun:
def is_first_rar(filename)
reg = Oniguruma::ORegexp.new('.*(?:(?<!part\d\d\d|part\d\d|\d)\.rar|\.part0*1\.rar)')
match = reg.match(filename)
return match != nil
end
Andere Tipps
Verlassen Sie sich nicht auf die Namen der Dateien, die man zu bestimmen, ist zuerst. Du wirst eine Kante Fall, um am Ende zu finden, wo Sie die falsche Datei.
RAR-Header wird Ihnen sagen, welche Datei ist die zuerst im Volumen auf, vorausgesetzt, sie wurden in einer etwas-aktuellere Version von RAR erstellt.
HEAD_FLAGS Bitflags:
2 Bytes0x0100 - Erste Band (Set nur von RAR 3.0 und höher)
So öffnen Sie jede Datei und die RAR-Header untersuchen, die speziell für die Flagge sucht, ist die erste Band, welche Datei angibt. Das wird nie scheitern, solange das Archiv nicht beschädigt ist. Ich habe meine eigenen Tests mit Spanning RAR-Archiven durchgeführt und deren Header korrekt sind nach den obigen Link.
Dies ist eine viel, viel sichere Art und Weise, die Datei zu bestimmen, in einem Satz wie diese zunächst.
Persönlich würde ich (extended) reguläre Ausdrücke in diesem Fall nicht (oder zumindest nicht nur eine um alles zu tun). Was mit Codierung diese in falsch ist, zum Beispiel ein paar if
s?
Ich bin kein Experte, aber Regex hier ist mein Versuch,
^(yes|no)\.(rar|part0*1\.rar)$
Ersetzen Sie "yes | no" mit dem tatsächlichen Dateinamen. Ich angepasst es gegen Ihre Beispiele zu sehen, ob es nur den ersten Satz daher die „yes | no“ entsprechen würde. In den Regex
UPDATE: fixed gemäß dem Kommentar. Nicht sicher, warum würde der Benutzer die Dateinamen nicht, so dass ich nicht, dass ein Teil fix habe ...