正则表达式匹配,如果子字符串不在字符串中

时间:2012-01-23 15:48:41

标签: regex

我想匹配尚未创建缩略图的文件。

因此,对于创建了两个缩略图的图像:

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

我正在寻找一些仅与image1.png匹配的正则表达式。

我目前只选择扩展程序:

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

一个或多个非连字符,后跟.jpg.png

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

无需负面预测。 (请注意,您现有的正则表达式实际上只相当于(\.(jpg|png)):前瞻没有实际效果,因为没有字符串可以(\.(jpg|png))作为前缀 (-(100x100|350x350))作为前缀。)


编辑添加:您的问题似乎有些自相矛盾,因为您最初说您“想要匹配尚未创建缩略图的文件”,但在您的示例中,您说要匹配image1.png,即使 已创建了两个缩略图。

在我看来,您还没有明确规定如何确定图像是否为缩略图。上面,我采用了最简单的方法,即假设缩略图的文件名包含连字符,而其他图像的文件名则不包含。或者,我们可能会对缩略图进行最狭窄的定义,并说“如果文件的文件名以.jpg.png结尾,而不是-100x100,则文件是非缩略图。 1}}或-350x350“;在这种情况下,我们可以写:

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

使用负面的lookbehind。 。 。假设一个支持负面观察的正则表达式引擎。 (你没有提到你正在使用的是什么语言?)如果没有负面的观察,我们可以改写:

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

但是使用两个正则表达式要简单得多:

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

并要求字符串与第二个匹配。你的问题意味着你想做一个肯定的正则表达式,但你没有提到为什么?

答案 2 :(得分:1)

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