46

私の問題は、純粋な正規表現でブラウザ文字列をチェックしたいということです。

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 完全に間違っています。

4

3 に答える 3

88

先読みアサーションを使用して、文字列に単語が含まれているかどうかを確認します。

文字列のどこかに「Android」が含まれていることを確認したい場合は、次のように実行できます。

^(?=.*Android).*

それらを組み合わせて、ある場所に「Android」が含まれ、ある場所に「モバイル」が含まれるようにすることもできます。

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

特定の単語が文字列に含まれていないことを確認する場合は、ネガティブルックアヘッドを使用します。

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

これには、「Android」という単語を文字列に含める必要があり、「Mobile」という単語を文字列に含めることはできません。.*最初のアサーションがtrueの場合、パーツは完全な文字列/行に一致します。

ここRegexrでそれを参照してください

于 2011-11-23T10:58:40.840 に答える
3

正規表現の一部の実装では、ネガティブルックビハインドアサーションを使用できます。ドキュメントによると(?<!...)、文字列内の現在の位置の前に一致するものがない場合にのみ、一致として記述されたネガティブルックビハインド...

サンプル文字列でネガティブルックビハインドを使用する方法を示す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
于 2011-11-23T10:51:12.387 に答える
1

私はそれを壊したい

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

とはいえ、正規表現のフレーバーによっては、それを組み合わせることができます

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

あるいは

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

参考までに先読み/後読み


更新これらをPerl5正規表現フレーバー(おそらく最も人気のあるフレーバー)でテストしました。

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

ショー:

1 yes

OPの特定の入力に対して

于 2011-11-23T10:45:02.300 に答える