RegExp使用NOT命令^?

时间:2011-11-23 13:47:41

标签: regex

如何格式化reg.exp。忽略搜索中的匹配文本。我们的文档格式如下:

  

ProductType_ [尺寸] [密度] .PDF

因此,在典型的文件夹中,文件列表为:

RN_HG_HighDry_001x450.pdf
RN_HG_HighDry_001x895.pdf
RN_HG_HighDry_002x136.pdf
RN_HG_HighDry_002x887.pdf
RN_HG_HighDry_FULL_5.pdf
RN_HG_HighDry_FULL2.pdf

我可以使用以下方法选择包含塑料尺寸的文件:

(\d{3}x\d{3}\.pdf$)

(我们指定pdf,因为有时文件夹包含其他无关的文件)

但我想创建一个表达式来选择没有塑料尺寸的pdf(但是有/没有密度大小),所以在英语中我想要做的是选择所有.pdf文件,除了那些包含字符串的文件(三个数字,字母'x',三个数字)。

我尝试过([^\d{3}x\d{3}]\d\.pdf$),我认为开始时的[^表示不是,但它不起作用。我也尝试了各种其他排列但无济于事。我今晚一直梦想着Reg.Exps,因为我已经玩了很长时间了!

2 个答案:

答案 0 :(得分:1)

使用方括号[]创建一个字符类,这意味着这样的类匹配类中的所有字符。你是对的,以^开头的角色类意味着不是,但在另一种意义上。它意味着匹配任何角色,但不匹配类中的角色。

[^\d{3}x\d{3}]将匹配任何字符,但不匹配数字,不是{,不是}而不是x

如果您的语言支持先行断言,则可以执行此操作

(?!^.*\d{3}x\d{3})\d\.pdf$

here at Regexr

(?!^.*\d{3}x\d{3})是一个负前瞻断言,它将检查整个字符串,如果找不到\d{3}x\d{3},断言将为真,它会尝试匹配\d\.pdf$

答案 1 :(得分:0)

如果你不支持负向前瞻,你基本上必须枚举你想要捕捉的模式。对于您的特定应用,为什么不排除那些您知道如何匹配的应用,并保留其余的应用?您没有提到您正在使用的编程语言或匹配程序,而是

vnix$ egrep -v '_[0-9]{3}x[0-9]{3}\.pdf$' listoffilenames | grep '\.pdf$'

从您提供的有限示例中,正面的正则表达式可能类似于

vnix$ egrep '[^0-9][0-9]\.pdf$' listoffilenames

会起作用,但我希望你想要一个覆盖率更高的正则表达式来捕获在.pdf扩展名之前根本没有任何数字的文件。稍微宽泛的模式可能是

vnix$ egrep '([^0-9]|[^0-9][0-9]{1,2}|[^x][0-9]{3})\.pdf$' listoffilenames

如果您仍需要帮助,请详细说明您的需求。