1

文字列を除く RegEx マッチ (否定的な先読み/後読みを使用) に関する SO に関する他の投稿を見てきましたが、まだ機能させるのに苦労しています。誰かが助けてくれることを望んでいました。

私は正規表現を持っています

\.(gif|jpg|png)$

(gif/jpg/png) で終わるファイル名と一致させるために使用します

ただし、特定のファイル名が一致しないように、除外リストを使用したいと考えています。

例えば

どうもありがとう!

4

3 に答える 3

2

除外の数が少ない場合は、次のように複数のネガティブルックビハインドを使用できます。

(?<!\/foo)(?<!\/bar)(?<!www\.site\.com\/foobar)\.(gif|jpg|png)$

fooとbarの前の「/」は、フルネームがfooまたはbarと一致することを確認します。それは、それで終わるだけではありません。ファイル名の前に「/」がない可能性がある場合は、この部分を調整する必要があります。

後読みの欠点の1つは、定義された長さしか使用できないため、、*または+{1,5}許可されないことです。すべての例外を単独で指定する必要があります。

ルックアラウンドは、それが見られる文字列の「位置」を変更しないことに注意してください。そのため、そのように連結することができます。

于 2012-06-01T07:49:16.907 に答える
2

以下を使用できます。

^(?!(foo|bar)\.(gif|jpg|png)$).*\.(gif|jpg|png)$

見る

于 2012-06-01T06:14:45.767 に答える
1

コードを 6 週間後に読み取ろうとすると、ほとんどの場合、正規表現とは別にそのようなフィルターを適用する方がよいことがわかりました。少しPerlを許すなら:

# Apply original png/gif/jpg filter to get list of files
my @files = qw/
    asdf.jpg
    bar.png
    fdsa.png
    foo.gif
    foo.jpg
/;

# Filter files to only those that don't look like ^<forbidden>\.
@files = grep {
    $_ !~ /^(foo|bar)\./
} @files;

これは特に、人々がシェル コマンドをつなぎ合わせる傾向がある方法でもあります。

于 2012-06-01T06:19:26.760 に答える