2011-11-23 35 views
1

如何格式化reg.exp。忽略搜索中的匹配文本。我們有格式如下文件:RegExp使用NOT命令^?

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',三個數字)。我想[^在開始意味着不是,但它不起作用。我也嘗試了各種其他排列,但無濟於事。我今晚會夢見Reg.Exps,因爲我一直在玩這麼久!

+3

負面預測。例如'(?!\ d {3} x)' –

+0

你提到了'塑料尺寸',但是在你的問題中沒有明確說明。你能否重新說清楚一點?我認爲寫一個樣本來證明什麼是有效的結果也是值得的。 – Moshe

+0

@Brad:或者'grep -v'(當然,假設他首先是在吝嗇)。 –

回答

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$

+0

感謝您的快速回復。 我試過了前瞻斷言,但我猜測我們的程序dosent支持它們,就像當我嘗試上述表達式'(?!^。* \ d {3} x \ d {3})\ d \ .pdf $ '它選擇了所有文件,除了沒有任何數字的文件。 – Robin

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 

如果您仍然需要幫助,請跟進您的需求更詳細的說明。