好吧,所以這是完全愚蠢的事情,但這是我從來沒有學會做和它的麻煩。所有字符串的正則表達式不包含字符串?
如何指定不包含其他字符序列的字符串。例如,我想匹配的是不要在「的.config」結尾的行
我會認爲我可能只是這樣做
.*[^(\.config)]$
但這不起作用(爲什麼不呢?)
我知道我可以做
.*[^\.][^c][^o][^n][^f][^i][^g]$
但請請請告訴我,有一個更好的辦法
好吧,所以這是完全愚蠢的事情,但這是我從來沒有學會做和它的麻煩。所有字符串的正則表達式不包含字符串?
如何指定不包含其他字符序列的字符串。例如,我想匹配的是不要在「的.config」結尾的行
我會認爲我可能只是這樣做
.*[^(\.config)]$
但這不起作用(爲什麼不呢?)
我知道我可以做
.*[^\.][^c][^o][^n][^f][^i][^g]$
但請請請告訴我,有一個更好的辦法
這有效,但。*(?!= \。config)$不 - 我認爲這兩種語法是等價的。任何線索? – 2009-12-28 22:01:10
它們不等價。 (?<!)匹配前面的字符串(後面看),而(?!)匹配下面的字符串(向前看) – Manu 2009-12-28 22:05:32
不,它們不是。負面的前瞻是'(?!matchthis)',而你的例子不能工作,因爲你已經在字符串末尾('''')的時候向前看。 – 2009-12-28 22:07:22
(?<!\.config)$
:)
除非你是 「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運行得更快。
除非你是grepping,爲什麼要使用regex呢? Python有'in'的原因。其他語言我確定有類似的解決方案。 – 2009-12-28 22:00:25
是的,這是我現在所做的,但最好是知道如何做到這一點。我遇到了這種情況,這迫使一些尷尬的語法。 – 2009-12-28 22:03:21
通過使用[^]
構造,您創建了否定字符類,它匹配除您命名的字符以外的所有字符。在候選匹配字符的順序並不重要,因此這將無法在具有任何的[(\.config)
(或[)gi.\onc(]
)任何字符串
使用負先行,(用Perl regexs)像這樣:(?!\.config$)
。這將匹配所有不匹配文字「.config」的字符串。
您的問題包含兩個問題,所以這裏有幾個答案。不
匹配線包含某些字符串(比如.config
)在所有:
^(?:(?!\.config).)*$\r?\n?
比賽線路中不某些字符串年底:
^.*(?<!\.config)$\r?\n?
,並作爲獎勵:匹配線不開始與一定的字符串:
^(?!\.config).*$\r?\n?
(每次都包括換行符,如果有的話)。
哦,並回答爲什麼你的版本不起作用:[^abc]
的意思是「除a,b或c之外的任何一(1)個字符」。您的其他解決方案也將無法在test.hg
(因爲它還在字母G結束 - 你的正則表達式看着一個個字符分別,而不是整個.config
字符串這就是爲什麼你需要lookaround處理這個
正如你所要求的。一個「更好的方式」:我會嘗試一個「過濾」的方法,我覺得這是很容易閱讀和理解:
#!/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 ...
我以前Regexpal找到這個頁面之前,用以下解決方案上來時,我想檢查一個字符串不包含文件擴展名:
^(.(?!\.[a-zA-Z0-9]{3,}))*$
我使用了m
複選框選項,這樣我可以顯示很多行並查看它們中的哪些行爲或不匹配。
所以要找到不包含其他"^(.(?!" +
表達式的字符串,你不希望+ "))*$"
做什麼是您使用正則表達式引擎?他們可以在支持的功能。你應該用你正在使用的引擎標記你的問題。 – Andrew 2009-12-28 22:01:57
爲什麼不使用'grep -v「\ .config」'? – Lazer 2010-05-23 06:32:52
@Lazer - 因爲不是世界上的一切都是* nix系統? – 2010-05-23 18:09:35