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

user1061688 picture user1061688 · Nov 23, 2011 · Viewed 39.7k times · Source

My problem is that i want to check the browserstring with pure regex.

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

-> should match

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 

should not match

my tried solution is: /?((?<=Android)(?:[^])*?(?=Mobile))/i but it matches exactly wrong.

Answer

stema picture stema · Nov 23, 2011

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