2015-04-24 50 views
0

另一個正則表達式困境,我希望找到所有包含.cc和.h擴展名的不包含pb單詞的X文件。另一個正則表達式難題:排除所有x但不是y

Example: 
Foo.cc 
FooTest.cc 
Bar.cc 
Bar.pb.cc 
Bar.pb.h 

Regex result: 
Foo.cc 
FooTest.cc 
Bar.cc 
+1

你做了什麼? –

+0

'grep'[。] \(cc \ | h \)'file_list | grep -v pb' :) – perreal

回答

3

使用以下命令:

^((?!pb).)*\.(cc|h)$ 

(?!pb)是負前瞻,將匹配後面沒有pb任何位置。所以((?!pb).)*將匹配任何不包含pb的子字符串。完整的正則表達式可以描述爲匹配整個字符串,只要它以'.cc'或'.h'結尾並且擴展名前面的子字符串不包含'pb'。

Regular expression visualization

Debuggex Demo

,如果你想匹配一個多行字符串,你需要將(?m)改性劑添加到您的正則表達式,使得每行^$作品,而不是整個如果你的lang不支持修飾符,則根據你使用的函數使用一個標誌。

+0

我特別喜歡你提出答案的方式。該圖像幫助很多。 – Juxhin

+0

你不需要檢查每個字符。它會降低性能。 –

+0

@Juxhin林間的那個:) – Kasramvd

2

您可以嘗試下面的基於負面lookahead的正則表達式。

^(?!.*?\bpb\b).*\.(?:cc|h)$ 

(?!.*\bpb\b)負先行斷言該字符串將被匹配將不包含單詞pb。如果沒有pb,那麼只有它試圖匹配字符串,而且字符串必須有cch擴展名。

DEMO

+0

爲什麼'\ bp \ b'而不是'\ .bp \ .'或只是'bp'? – Taemyr

+0

'不包含pb單詞.',前後添加單詞邊界將滿足這一點。 –

+0

夠公平的,我認爲你對這句話讀得太多了。 – Taemyr