2012-01-23 4 views
1

Я хочу сопоставить файлы, у которых еще нет созданных миниатюр.Regex Match, если подстрока не находится в строке

Таким образом, для изображения, которое было две миниатюры, созданные:

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

Я завожусь регулярное выражение, чтобы соответствовать только image1.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

Согласовано, это один из тех вопросов с неполными и неопределенными требованиями. – anubhava

2

один или более не дефис, а затем .jpg или .png:

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

Нет необходимости отрицательного предпросмотра. (Обратите внимание, что существующее регулярное выражение фактически эквивалентно просто (\.(jpg|png)): опережения не имеют никакого реального эффекта, так как строка не может иметь (\.(jpg|png)) как префикс и(-(100x100|350x350)) в качестве префикса.)


Отредактировано добавить: Ваш вопрос кажется несколько противоречивым, поскольку вы изначально говорите, что хотите «найти файлы, которые еще не создали миниатюры», но затем в вашем примере вы говорите, что хотите сопоставить image1.png, хотя он имеет было создано два эскизов.

Вы также, на мой взгляд, не даете четких правил определения того, как изображение является миниатюрой. Выше, я взял самый простой подход, который должен предположить, что имена файлов эскизов содержат дефисы и другие имена файлов изображений. В качестве альтернативы мы можем взять самое узкое определение миниатюрного изображения и сказать, что «файл представляет собой изображение без миниатюр, если его имя файла заканчивается на .jpg или .png, которому не предшествуют -100x100 или -350x350»; в этом случае мы можем написать:

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

используя отрицательный lookbehind. , , предполагая двигатель регулярных выражений, который поддерживает отрицательный lookbehind. (? Вы не говоря уже о каком языке вы используете) без отрицательного просмотра назад, мы можем вместо этого написать:

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

но это гораздо проще использовать два регулярных выражений:

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

и требуют что строка не соответствует второму. Ваш вопрос подразумевает, что вы хотите сделать это как одно положительное регулярное выражение, но вы не упоминаете, почему?

+0

хех, совершенно очевидно :) просто о том, чтобы получить возможность отправлять один и тот же ответ – keymone

+0

Что делать, если имя файла ' новый image.png'? –

+0

@TimPietzcker: Тогда, очевидно, это миниатюра с размерами 'image', для изображения с именем' new.png'. Duh! (ОК, более серьезно: моя личная политика при создании регулярного выражения, для которого требования не ясны, заключается в выборе простейшего регулярного выражения, которое удовлетворяет * правдоподобным * требованиям, а затем документирует, что он делает. Если окажется, что эти требования недостаточно, то, если ничего другого, я помог OP выполнить требования.) – ruakh

1

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

+1

Извините, но это неправильно. '(?! ...)' не работает так, как вы думаете. – ruakh

Смежные вопросы