2011-11-23 134 views
22

我的問題是我想用純正則表達式檢查瀏覽器字符串。是否有正則表達式來匹配包含A但不包含B的字符串

Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 

- >應符合

Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; Nexus One Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 

不應該匹配

我試過的解決辦法是:/?((?<=Android)(?:[^])*?(?=Mobile))/i 但它完全匹配錯誤。

+2

什麼語言,正則表達式? http://www.regular-expressions.info/tools.html – sehe

+0

它也不是那麼容易:[http://stackoverflow.com/q/8186424/241506][1] [1]: http://stackoverflow.com/q/8186424/241506 – VMykyt

+0

你想用'(?:[^])*?'表達什麼? – stema

回答

2

我只是把它分解

if ((m/Android/i) && (m/Safari/i) && !(m/Mobile Safari/i)) 

這就是說,根據正則表達式flaviour,你可以結合這

if ((m/Android/i) && (m/(?<!Mobile)Safari/i)) 

甚至

if (m/Android.*(?<!Mobile)Safari/i) 

FYI看到Lookahead/lookbehind


更新測試這些罰款與Perl5的正則表達式的味道(可以說是最流行的味道):

perl -ne 'print "$. yes\n" if m/Android.*(?<!Mobile)Safari/i' 

表演:

1 yes 

在OP給定的輸入

+0

現在用Perl5兼容regexen – sehe

2

隨着一些正則表達式的實現,你可以使用負面的後向斷言。 %的文檔,寫爲(?<!...)負回顧後僅匹配如果字符串在當前位置不匹配的...

之前這裏是展示如何使用負回顧後與樣品串一個Python交互腳本:

>>> s = "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13" 
>>> bool(re.search(r'Android.*(?<! Mobile) Safari', s)) 
True 

>>> t = "Mozilla/5.0 (Linux; U; Android 2.2.1; en-us; Nexus One Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1" 
>>> bool(re.search(r'Android.*(?<! Mobile) Safari', t)) 
False 
37

您可以使用向前看斷言來檢查一個字符串是否包含一個單詞。

如果你想確保該字符串中包含「機器人」在一些地方,你可以做這樣的:

^(?=.*Android).* 

您也可以將它們結合起來,以確保它包含「機器人」在一些地方和「移動」在一些地方:

^(?=.*Android)(?=.*Mobile).* 

如果你想確保某個詞是不是在字符串中,用超前的負外觀:

^(?=.*Android)(?!.*Mobile).* 

這將要求單詞「Android在字符串中,字符串中不允許使用」Mobile「這個詞。當開始處的斷言爲真時,.*部分匹配完整的字符串/行。

查看here on Regexr

+0

對最簡單的純正則表達式進行測試,但是我會把它寫成'^(?=。* Android)(?!。* Mobile)。否則,這些預測將應用於每個位置或直到它們都成功。您的正則表達式按預期工作,因爲積極的lookahead總是在各處開始失敗,但如果您只有負面lookahead? –

+0

@AlanMoore感謝您的建議,我使用它編輯了我的答案。 – stema

相關問題