76 votes

Expression régulière qui ne contient pas certaines chaînes

J'ai quelque chose comme ça

aabbabcaabda

pour sélectionner le groupe minimal enveloppé par a J'ai ceci /a([^a]*)a/ qui fonctionne très bien

Mais j'ai un problème avec les groupes enveloppés par aa alors que j'aurais besoin de quelque chose comme /aa([^aa]*)aa/ ce qui ne fonctionne pas, et je ne peux pas utiliser la première comme /aa([^a]*)aa/ car il se terminerait à la première occurrence de a ce que je ne veux pas.

Généralement, y a-t-il un moyen, comment dire ne contient pas de chaîne de la même manière que je peux dire ne contient pas de caractère avec [^a] ?

Pour faire simple, j'ai besoin aa suivi de n'importe quel caractère sauf la séquence aa et se termine par aa

206voto

Cd-MaN Points 7911

Grâce à la puissance de Google :-p j'ai trouvé un article de blog datant de 2007 ce qui donne la regex suivante qui correspond à la chaîne qui Ne le fais pas. contiennent une certaine sous-chaîne :

^((?!my string).)*$

Il fonctionne de la manière suivante : il recherche zéro ou plusieurs caractères (*) (.) qui ne sont pas précédés ( ?! - lookahead négatif) par votre chaîne et il stipule que la chaîne entière doit être composée de tels caractères (en utilisant les ancres ^ et $). Ou pour le dire autrement :

La chaîne entière doit être composée de caractères qui ne sont pas précédés d'une chaîne donnée, ce qui signifie que la chaîne ne contient pas la sous-chaîne donnée.

18voto

Claudiu Points 58398

En général, il est pénible d'écrire une expression régulière pas contenant une chaîne de caractères particulière. Nous avons dû procéder de la sorte pour les modèles de calcul - vous prenez une NFA, qui est assez facile à définir, puis vous la réduisez à une expression régulière. L'expression pour les choses ne contenant pas "chat" faisait environ 80 caractères.

Edit : Je viens de finir et oui, c'est :

aa([^a] | a[^a])aa

Ici est un tutoriel très bref. J'en ai trouvé d'excellents avant, mais je ne les vois plus.

10voto

Alan Moore Points 39365

Tout ce dont vous avez besoin est un quantificateur réticent :

regex: /aa.*?aa/

aabbabcaabda   => aabbabcaa

aaaaaabda      => aaaa

aabbabcaabda   => aabbabcaa

aababaaaabdaa  => aababaa, aabdaa

Vous pourriez aussi utiliser un lookahead négatif, mais dans ce cas, c'est juste une façon plus verbeuse d'accomplir la même chose. De plus, c'est un peu plus délicat que ce que gpojd a laissé entendre. Le lookahead doit être appliqué à chaque position avant que le point ne soit autorisé à consommer le caractère suivant.

/aa(?:(?!aa).)*aa/

Quant à l'approche suggérée par Claudiu et finnw, elle fonctionne bien lorsque la chaîne sentinelle ne comporte que deux caractères, mais (comme Claudiu l'a reconnu) elle est trop lourde pour les chaînes plus longues.

7voto

finnw Points 24592
/aa([^a]|a[^a])*aa/

4voto

javahaxxor Points 54

Dans le code suivant, j'ai dû ajouter un paramètre GET à toutes les références aux fichiers JS SAUF un.

<link rel="stylesheet" type="text/css" href="http://stackoverflow.com/login/css/ABC.css" />
<script type="text/javascript" language="javascript" src="/localization/DEF.js"></script>
<script type="text/javascript" language="javascript" src="/login/jslib/GHI.js"></script>
<script type="text/javascript" language="javascript" src="/login/jslib/md5.js"></script>
sendRequest('/application/srvc/EXCEPTION.js', handleChallengeResponse, null);
sendRequest('/application/srvc/EXCEPTION.js",handleChallengeResponse, null);

C'est le Matcher utilisé :

(?<!EXCEPTION)(\.js)

Il s'agit de rechercher toutes les occurrences de ".js" et, si elles sont précédées de la chaîne "EXCEPTION", d'éliminer ce résultat du tableau des résultats. C'est ce qu'on appelle le lookbehind négatif. Puisque j'ai passé une journée à trouver comment faire cela, j'ai pensé que je devais partager.

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