Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

User agent regular expression

I'm almost embarrassed to ask, but just almost. I seem to have an expression that works already, but it only seem to work in various regex tools like Regulator or online tools. Once in my C# code, it fails to hit where it should.

So the issue is that I need the regex to hit on user agent strings containing "android", "iphone" or "ipod", but not those also containing "opera". Simple enough, right?

So far, I've got this:

^(?=.*?\b(android|iphone|ipod)\b)(?!opera).*$

I'm using following options

RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase | RegexOptions.Singleline

Please tell me where I got it wrong.

Here are some user agent strings. The expression should trigger on first and last, while ignore the two in the middle:

Mozilla/5.0+(Linux;+U;+Android+2.2;+nb-no;+Nexus+One+Build/FRF91)+AppleWebKit/533.1+(KHTML,+like Gecko)+Version/4.0+Mobile+Safari/533.1
Opera/9.80 (Android; Linux; Opera Mobi/ADR-1012221546; U; pl) Presto/2.7.60 Version/10.5
Opera/9.80 (J2ME/iPhone;Opera Mini/5.0.019802/886; U; ja)Presto/2.4.15
Mozila/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Geckto) Version/3.0 Mobile/3A101a Safari/419.3

Thanks

like image 661
danijels Avatar asked Jun 24 '11 08:06

danijels


1 Answers

Have you remembered to add a "@" in front of the pattern string? If not, the "\b" will be interpreted as a backspace.

Also as some say, you are not checking for Opera anywhere but in the beginning of the line, is that on purpose? I would probably use this syntax instead:
@"^(?!opera)(?=.*\b(android|iphone|ipod)\b).*$"

like image 161
Johny Skovdal Avatar answered Oct 02 '22 21:10

Johny Skovdal