2011-11-23 12 views
22

içermiyor Sorunum, browserstring'i saf regex ile kontrol etmek istiyorum. /?((?<=Android)(?:[^])*?(?=Mobile))/i ama tam olarak yanlış eşleşir: -A içeren bir dizeyle eşleşecek bir regex var mı, ancak 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 

benim denenmiş çözüm eşleşmemelidir eşleşmesi gerekir olduğunu.

+2

hangi dil, regex flavor? http://www.regular-expressions.info/tools.html – sehe

+0

o kadar kolay değildir: [http://stackoverflow.com/q/8186424/241506][1] [1]: http://stackoverflow.com/q/8186424/241506 – VMykyt

+0

'(?: [^]) *?' ile neyi ifade etmek istersiniz? – stema

cevap

2

Sadece regex flaviour bağlı olarak söz konusu

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

, sen

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

veya Bilginize hatta

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

görmek birleştirebilirsiniz yukarı kırmak istiyorum Lookahead/lookbehind


Güncelleme Test Perl5 regex lezzet (muhtemelen en popüler tadında) bu ince:

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

Gösterim: OP verilen giriş için

1 yes 

+0

Şimdi en basit saf-regex yaklaşımı için Perl5 uyumlu regexen – sehe

2

ile Bazı düzenli ifadeler uygulamaları, olumsuz bir lookbehind onaylama kullanabilirsiniz. dizede geçerli konum ...

için bir maç öncesinde edilmemesi durumunda dokümanlar Başına , (?<!...) olarak yazılmış bir negatif olan ileriye dönük İşte örnek dizeleri ile Negatif Geriye İlerleme nasıl kullanılacağını gösteren bir Python etkileşimli bir senaryo eşleşir:

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

Bir dizenin bir sözcük içerip içermediğini kontrol etmek için ileriye bakma ifadelerini kullanırsınız.

sen dize bazı yerde "Android" içerdiğini temin etmek istiyorsanız bunu şöyle yapabiliriz:

^(?=.*Android).* 

Ayrıca bazı yerde "Android" içerdiğinden emin olmak için, birleştirebilirsiniz VE bazı yerde "Mobil":

^(?=.*Android)(?!.*Mobile).* 
: Aradığınız bir kelimeyi dizede OLMADIĞIDIR sağlamak istiyorsanız

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

öncesinde negatif görünümü kullan

Bu, "Android dizenin içinde olmak ve" Mobil "sözcüğünün dizeye eklenmesine izin verilmesini gerektirir. .* bölümü, başlangıçtaki ifadeler doğru olduğunda tam dizge/satır ile eşleşir.

Bakın here on Regexr

+0

+1 ile test ettim, ancak ben bunu “^ (? =. * Android) (?!. * Mobile). *' Olarak yazacağım. Aksi takdirde, göz atma noktaları her pozisyonda veya her ikisi de başarılı oluncaya kadar uygulanacaktır. Normal ifadeleriniz beklendiği gibi çalışır, çünkü pozitif bakışlar her zaman her yerde başarısız olurlar, ama eğer sadece olumsuz bakış açılarınız varsa? –

+0

@AlanMoore Öneri için teşekkürler, cevabımı kullanarak düzenledim. – stema

İlgili konular