1

unrarコマンドを呼び出すファイルを確認するには、ファイルセットの最初のファイルを特定する必要があります。

以下にいくつかのサンプルファイル名を示します。そのうちの-当然のことながら-最初のグループのみが一致する必要があります。

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

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

PCRE互換の正規表現でそれを行う1つの(制限された)方法は次のとおりです。

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

ただし、 Rejaxでテストしたところ、これはRubyでは機能しませんでした。

RARファイルのセットの最初のファイルのみに一致する1つのRuby互換正規表現をどのように記述しますか?

4

4 に答える 4

4

ファイルの名前に依存して、どちらが最初かを判断しないでください。間違ったファイルを取得するエッジケースを見つけることになります。

RARのヘッダーは、RARのやや最近のバージョンで作成されたと仮定して、ボリュームの最初のファイルを示します。

HEAD_FLAGSビットフラグ:
2バイト

0x0100-最初のボリューム(RAR 3.0以降でのみ設定)

したがって、各ファイルを開いてRARヘッダーを調べ、どのファイルが最初のボリュームであるかを示すフラグを具体的に探します。アーカイブが破損していない限り、これが失敗することはありません。私はRARアーカイブにまたがって独自のテストを行いましたが、それらのヘッダーは上記のリンクに従って正しいです。

これは、このようなセットの最初にあるファイルを判別するためのはるかに安全な方法です。

于 2010-03-29T13:13:38.813 に答える
3

簡単な答えは、問題を満たす単一の正規表現を構築することはできないということです。Ruby 1.8 にはルックアラウンド アサーション (例の正規表現の (?<! のもの) がないため、正規表現が機能しません。これにより、2 つのオプションが残されます。

1)複数の正規表現を使用してそれを行います。

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

2) Ruby 1.9 の正規表現エンジン、鬼車を使用します。ルックアラウンド アサーションをサポートし、 ruby​​ 1.8 の gem としてインストールできます。その後、次のようなことができます。

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
于 2008-09-21T03:31:40.227 に答える
0

私は正規表現の専門家ではありませんが、ここに私の試みがあります

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

「yes|no」を実際のファイル名に置き換えます。あなたの例と照合して、最初のセットのみに一致するかどうかを確認しました。したがって、正規表現の「はい|いいえ」です。

更新: コメントに従って修正されました。ユーザーがファイル名を知らない理由がわからないので、その部分を修正しませんでした...

于 2008-09-21T03:08:24.493 に答える
0

個人的には、この場合 (拡張された) 正規表現を使用しません (または、少なくとも 1 つだけですべてを行うわけではありません)。たとえば、数秒でこれをコーディングすることの何が問題になっていifますか?

于 2008-09-21T03:09:18.423 に答える