Regulärer Ausdruck nur die erste Datei in einem RAR-Datei Satz übereinstimmen

StackOverflow https://stackoverflow.com/questions/109916

  •  02-07-2019
  •  | 
  •  

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?

War es hilfreich?

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 Bytes

     
    

0x0100 - 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 ifs?

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 ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top