2009-12-28 189 views
19

好吧,所以這是完全愚蠢的事情,但這是我從來沒有學會做和它的麻煩。所有字符串的正則表達式不包含字符串?

如何指定不包含其他字符序列的字符串。例如,我想匹配的是不要在「的.config」結尾的行

我會認爲我可能只是這樣做

.*[^(\.config)]$ 

但這不起作用(爲什麼不呢?)

我知道我可以做

.*[^\.][^c][^o][^n][^f][^i][^g]$ 

但請請請告訴我,有一個更好的辦法

+1

做什麼是您使用正則表達式引擎?他們可以在支持的功能。你應該用你正在使用的引擎標記你的問題。 – Andrew 2009-12-28 22:01:57

+1

爲什麼不使用'grep -v「\ .config」'? – Lazer 2010-05-23 06:32:52

+6

@Lazer - 因爲不是世界上的一切都是* nix系統? – 2010-05-23 18:09:35

回答

40

您可以使用negative lookbehind,如:

.*(?<!\.config)$ 

這除了那些用 「的.config」

+0

這有效,但。*(?!= \。config)$不 - 我認爲這兩種語法是等價的。任何線索? – 2009-12-28 22:01:10

+2

它們不等價。 (?<!)匹配前面的字符串(後面看),而(?!)匹配下面的字符串(向前看) – Manu 2009-12-28 22:05:32

+1

不,它們不是。負面的前瞻是'(?!matchthis)',而你的例子不能工作,因爲你已經在字符串末尾('''')的時候向前看。 – 2009-12-28 22:07:22

2

除非你是 「grepping」 結尾的所有字符串匹配...由於您沒有使用匹配結果,爲什麼不搜索以.config結尾的字符串並跳過它們呢?在Python中:

import re 
isConfig = re.compile('\.config$') 
# List lst is given 
filteredList = [f.strip() for f in lst if not isConfig.match(f.strip())] 

我懷疑這會比一個更復雜的re運行得更快。

+1

除非你是grepping,爲什麼要使用regex呢? Python有'in'的原因。其他語言我確定有類似的解決方案。 – 2009-12-28 22:00:25

+0

是的,這是我現在所做的,但最好是知道如何做到這一點。我遇到了這種情況,這迫使一些尷尬的語法。 – 2009-12-28 22:03:21

2

通過使用[^]構造,您創建了否定字符類,它匹配除您命名的字符以外的所有字符。在候選匹配字符的順序並不重要,因此這將無法在具有任何的[(\.config)(或[)gi.\onc(])任何字符串

使用負先行,(用Perl regexs)像這樣:(?!\.config$)。這將匹配所有不匹配文字「.config」的字符串。

15

您的問題包含兩個問題,所以這裏有幾個答案。不

匹配線包含某些字符串(比如.config)在所有:

^(?:(?!\.config).)*$\r?\n? 

比賽線路中不某些字符串年底

^.*(?<!\.config)$\r?\n? 

,並作爲獎勵:匹配線不開始與一定的字符串:

^(?!\.config).*$\r?\n? 

(每次都包括換行符,如果有的話)。

哦,並回答爲什麼你的版本不起作用:[^abc]的意思是「除a,b或c之外的任何一(1)個字符」。您的其他解決方案也將無法在test.hg(因爲它還在字母G結束 - 你的正則表達式看着一個個字符分別,而不是整個.config字符串這就是爲什麼你需要lookaround處理這個

2

正如你所要求的。一個「更好的方式」:我會嘗試一個「過濾」的方法,我覺得這是很容易閱讀和理解:

#!/usr/bin/perl 

while(<>) { 
    next if /\.config$/; # ignore the line if it ends with ".config" 
    print; 
} 

正如你可以看到我用Perl代碼作爲一個例子,但我想。你有想法嗎?

加了: 這種方法也可以用於鏈更多的篩選模式,它仍然保持良好的可讀性,易懂,

next if /\.config$/; # ignore the line if it ends with ".config" 
    next if /\.ini$/; # ignore the line if it ends with ".ini" 
    next if /\.reg$/; # ignore the line if it ends with ".reg" 

    # now we have filtered out all the lines we want to skip 
    ... process only the lines we want to use ... 
0

我以前Regexpal找到這個頁面之前,用以下解決方案上來時,我想檢查一個字符串不包含文件擴展名:

^(.(?!\.[a-zA-Z0-9]{3,}))*$我使用了m複選框選項,這樣我可以顯示很多行並查看它們中的哪些行爲或不匹配。

所以要找到不包含其他"^(.(?!" +表達式的字符串,你不希望+ "))*$"

My article on the uses of this particular regex

相關問題