2012-01-23 24 views
1

サムネイルがまだ作成されていないファイルと一致させたいと思います。部分文字列が文字列に含まれていない場合の正規表現一致

ので、作成した2つのサムネイルを持っていたイメージのために:いくつかの正規表現のみimage1.pngを一致させるため

image1-100x100.png 
image1-350x350.png 
image1.png 

私が探しています。

は私が現時点で持っていると、拡張子を選択のみ:.jpgまたは.png続い

(?!(-(100x100|350x350)))(\.(jpg|png)) 

答えて

3

これを試してみてください:

^(?!.*-(?:100x100|350x350)).*\.(?:jpg|png)$ 

説明:

^      # Start of string 
(?!     # Assert that it's impossible to match... 
.*     # any string, followed by 
-     # a dash, followed by 
(?:100x100|350x350) # 100x100 or 350x350 
)      # End of lookahead. 
.*     # Then match any string 
\.     # followed by a dot 
(?:jpg|png)   # and a jpg/png extension. 
$      # End of string 
+0

ファイル名が 'image1-200x200.png'の場合はどうなりますか? – anubhava

+0

あなたは賢いです。さて、通常、サムネイルのサイズはファイル名よりも標準化されていますが、変数が可変であればそれを考慮する必要があります。ルールは、推測以上のことを行うには十分明確に定義されていません。 –

+0

合意されていれば、不完全で不明確な要求事項の1つです。 – anubhava

2

つ以上の非ハイフン、負の先読みのための

^[^-]+\.(?:jpg|png)$ 

必要はありません。 (既存の正規表現が実際にちょうど(\.(jpg|png))と同等であることに注意してください:何の文字列がプレフィックスとしてとして(\.(jpg|png))(-(100x100|350x350))を持っていない可能性があるので、先読みは、本当の効果がありません)


追加する編集:あなたの質問は、最初は「サムネイルがまだ作成されていないファイルと一致させたい」と言っていますが、あなたの例では、と一致させたいと言うと、に2つのサムネイルが作成されました。

私の意見では、イメージがサムネイルであるかどうかを判断する方法についての明確なルールは与えないでください。上では、サムネイルのファイル名にハイフンが含まれていて、他の画像のファイル名には含まれていないと仮定するのが最も簡単な方法でした。あるいは、ファイル名が.jpgまたは.pngで、末尾に「-100x100」または「-350x350」がない場合、ファイルはサムネイル画像の最も狭い定義を取り、「非サムネイル画像です。その場合、次のように書くことができます:

^.*(?<!-100x100)(?<!-350x350)\.(?:jpg|png)\z 

負のlookbehindを使用します。 。 。負のlookbehindをサポートする正規表現エンジンを前提としています。

^(?:[^-]|-(?!(?:100x100|350x350)\.(?:jpg|png)\z))*\.(?:jpg|png)\z 

しかし、それはちょうど2つの正規表現を使用することがはるかに簡単です::負の後読みがなければ、私たちが代わりに書くことができる(?あなたが使用しているどのような言語は言及していない)

\.(?:jpg|png)\z 
-(?:100x100|350x350)\.(?:jpg|png)\z 

および必要に文字列ではなく、が2番目の文字列と一致します。あなたの質問は、単一の肯定的な正規表現としてこれをやりたがっていることを意味しますが、あなたはなぜ言及していませんか?

+0

あわや、非常に明白:)は、同じ答え – keymone

+0

何あなたのファイル名が 'である場合を投稿するちょうど約ましたnew-image.png'? –

+0

@TimPietzcker:明らかに、それは 'new.png'という名前の画像に対して、寸法' image'を持つサムネイルです。ダー! (より真剣に:私の個人的な方針は、要件が明確ではない正規表現を構築するときに、*もっともらしい*要件を満たす最も簡単な正規表現を選択し、それが何であるかを文書化することです。十分ではない、それ以外のものがなければ、私はOPが要件を満たすのを助けました。) – ruakh

1

^(.+)(?!(-((\d+)x(\d+))))(\.(jpg|png))$

+1

申し訳ありませんが、間違っています。 '(?!...)'はあなたが思うように動作しません。 – ruakh

関連する問題