2015-09-03 1 views
1

Je sais trois choses ...Comment nier une chaîne regex

1) Je sais que:

a.{1,250}?z 

vérifiera que est à moins de 250 caractères de z.

2) Je sais que

a[^b]{1,250}?z 

vérifiera que est à moins de 250 caractères de z, mais aucun de ces caractères sont b.

3) Je sais aussi que

a[^bad]{1,250}?z 

vérifiera que est à moins de 250 caractères de z, mais aucun de ces caractères sont b, un ou d.

mais

4)

Comment wow aurais-je vérifier que se produit à moins de 250 caractères de z, mais que le mauvais mot ne semble pas entre eux?

Imaginant nécessaire une correspondance exacte "string" (comme dans une recherche google) le pseudo-code ressemblerait à ceci:

a[^"bad"]{1,250}?z 

Répondre

3

simple, utilisez un ngeative préanalyse.

a(?:(?!bad).){1,250}?z 

(?:(?!bad).) correspondrait tout caractère (sauf les sauts de ligne) mais pas de la sous-chaîne bad.

DEMO

Et aussi, vous devez utiliser des ancres ou des limites de mots dans l'ordre pour faire une correspondance exacte ou autrement, l'expression rationnelle ci-dessus correspondrait adccz pour cette entrée acbadccz.

\ba(?:(?!bad).){1,250}?z\b 
+0

Ceci est parfait. – COMisHARD

+0

Pas exactement * regular * (les lookaheads sont une extension), mais je ne suis pas sûr que cela puisse être résolu techniquement avec des expressions régulières pures ... Donc vous obtenez +1 de moi :) – Sebivor

+0

@Seb, lookahead négatif peut être résolu complètement avec une expression régulière simple, mais en général, une expression régulière qui correspond à l'ensemble exact de chaînes est beaucoup plus compliquée que l'original. C'est la raison de l'extension. Il est facile de démontrer avec des automates finis, mais en dehors du temps et de l'espace disponibles ici. –