Domanda

Per vedere quali file per richiamare l'unrar comando, si deve determinare quali file è il primo set di file.

Ecco alcuni esempi di nomi di file, di cui - naturalmente - solo il primo gruppo dovrebbe essere abbinati:

yes.rar
yes.part1.rar
yes.part01.rar
yes.part001.rar

no.part2.rar
no.part02.rar
no.part002.rar
no.part011.rar

Una (limitata) di un modo per farlo con PCRE compatibile espressioni è questo:

.*(?:(?<!part\d\d\d|part\d\d|\d)\.rar|\.part0*1\.rar)

Questo non ha funzionato in Ruby quando ho provato a Rejax tuttavia.

Come scrivere una Ruby compatibile espressione regolare per trovare solo il primo file in un insieme di file RAR?

È stato utile?

Soluzione

La risposta breve è che non è possibile costruire un unico regex per soddisfare il vostro problema.Ruby 1.8 non hanno lookaround affermazioni (il (?<!la roba nel tuo esempio regex) che è il motivo per cui la tua regex non funziona.Questo ti lascia con due opzioni.

1) Utilizzare più di una regex per farlo.

def is_first_rar(filename)
    if ((filename =~ /part(\d+)\.rar$/) == nil)
        return (filename =~ /\.rar$/) != nil
    else
        return $1.to_i == 1
    end
end

2) Utilizzare il motore regex per ruby 1.9, Oniguruma.Supporta lookaround affermazioni, e si può installarlo come un gioiello per ruby 1.8.Dopo di che, si può fare qualcosa di simile a questo:

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

Altri suggerimenti

Non fare affidamento sui nomi dei file per determinare quale è il primo. Finirai per trovare un caso limite in cui ottieni il file sbagliato.

Le intestazioni di RAR ti diranno quale file è il primo nel volume, supponendo che siano stati creati in una versione un po 'recente di RAR.

  

HEAD_FLAGS Bit flags:
  2 byte

     
    

0x0100 - Primo volume (impostato solo da RAR 3.0 e versioni successive)

  

Quindi apri ogni file ed esamina le intestazioni RAR, cercando specificamente il flag che indica quale file è il primo volume. Questo non fallirà mai, a condizione che l'archivio non sia corrotto. Ho fatto i miei test con lo spanning degli archivi RAR e le loro intestazioni sono corrette secondo il link sopra.

Questo è un modo molto, molto più sicuro per determinare quale file è il primo in un set come questo.

Personalmente non userei (estese) espressioni regolari in questo caso (o almeno non solo una per fare tutto). Cosa c'è di sbagliato nel codificare questo in, ad esempio, alcune if s?

Non sono un esperto di regex ma ecco il mio tentativo

^(yes|no)\.(rar|part0*1\.rar)$

Sostituisci " sì | no " con il nome del file effettivo. L'ho confrontato con i tuoi esempi per vedere se corrisponderebbe solo al primo set da qui il & Quot; yes | no & Quot; nella regex.

AGGIORNAMENTO: risolto come da commento. Non sono sicuro del motivo per cui l'utente non conoscerebbe il nome del file, quindi non ho corretto quella parte ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top