2012-08-01 44 views
0

在bash中,我試圖匹配存在於數組中的有效屬性。屬性可以通過在「爆炸」(驚歎號,!)前面加以「禁用」,在這種情況下,它們不得匹配。我有這樣的:正則表達式匹配前面沒有爆炸的字符串

[[ ${TESTS[@]} =~ [^\!]match ]] 

如果單詞「匹配」是在測試中,而不是前面有一個將返回true!

它起作用,除非單詞匹配位於數組中的第一個位置。問題是正則表達式是說''匹配之前是不是!。當它是第一個項目時,它前面沒有任何內容,因此不匹配。

如何修改上述內容以說明'未匹配!

從閱讀其他問題的答案我試過(?< !!)匹配但這不起作用。

回答

2

使用此重:

([^\!]|^)match 

使用示例:

$ [[ match =~ (^|[^\!])match ]] && echo matches || echo "doesn't match" 
matches 
$ [[ xmatch =~ (^|[^\!])match ]] && echo matches || echo "doesn't match" 
matches 
$ [[ '!match' =~ (^|[^\!])match ]] && echo match || echo "doesn't match" 
doesn't match 

在一般情況下,它也將是正確的用在這裏斷言,不過Bash使用POSIX正則表達式和他們一無所知斷言。但隨着grep(GNU的grep),或perl,或任何支持PCRE你可以做到這一點:

$ echo match | grep -qP '(?<!!)match' && echo matches || echo "doesn't match" 
matches 
$ echo xmatch | grep -qP '(?<!!)match' && echo matches || echo "doesn't match" 
matches 
$ echo '!match' | grep -qP '(?<!!)match' && echo matches || echo "doesn't match" 
doesn't match 
+0

所以這是一個'IF-THEN-else'沒有'then'是否正確? – BlackVegetable 2012-08-01 16:55:44

+0

@BlackVegetable:'if THING1;然後THING2;其他THING3; fi = THING1&&THING2 || THING3' – 2012-08-01 16:57:32

+0

對,就像我想的那樣。謝謝! – BlackVegetable 2012-08-01 16:59:17