45 votes

Existe-t-il une expression rationnelle pour faire correspondre une chaîne qui contient A mais ne contient pas B

Mon problème est que je veux vérifier la chaîne du navigateur avec une expression régulière pure.

 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

-> devrait correspondre

 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 

ne devrait pas correspondre

ma solution essayée est : /?((?<=Android)(?:[^])*?(?=Mobile))/i mais il correspond exactement faux.

3voto

Raymond Hettinger Points 231

Avec certaines implémentations d'expressions régulières, vous pouvez utiliser une assertion d'analyse négative. Selon la documentation, un lookbehind négatif écrit sous la forme (?<!...) correspond uniquement si la position actuelle dans la chaîne n'est pas précédée d'une correspondance pour ...

Voici un script interactif Python montrant comment utiliser le lookbehind négatif avec vos exemples de chaînes :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X