Is there a regex to match a string that contains A but does not contain B

你离开我真会死。 提交于 2019-11-28 17:00:08

You use look ahead assertions to check if a string contains a word or not.

If you want to assure that the string contains "Android" at some place you can do it like this:

^(?=.*Android).*

You can also combine them, to ensure that it contains "Android" at some place AND "Mobile" at some place:

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

If you want to ensure that a certain word is NOT in the string, use the negative look ahead:

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

This would require the word "Android to be in the string and the word "Mobile" is not allowed in the string. The .* part matches then the complete string/row when the assertions at the beginning are true.

See it here on Regexr

With some implementations of regular expressions, you can use a negative lookbehind assertion. Per the docs, a negative lookbehind written as (?<!...) matches only if the current position in the string is not preceded by a match for ...

Here's a Python interactive script showing how to use negative lookbehind with your sample strings:

>>> 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

I'd just break it up

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

That said, depending on regex flaviour, you could combine that

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

or even

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

FYI see Lookahead/lookbehind


Update Tested these fine with Perl5 regex flavour (arguably the most popular flavour):

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

Shows:

1 yes

for the given input in the OP

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!