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

J’ai quelque chose comme ça

aabbabcaabda

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

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

En général, 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] ?

Simplement dit, il me faut aa suivi de tout caractère sauf séquence aa et se termine ensuite par aa

En général, écrire une expression régulière ne contenant pas de chaîne particulière est pénible. Nous avons dû le faire 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” était d’environ 80 caractères.

Edit: Je viens de terminer et oui, c’est:

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

Voici un très bref tutoriel. J’en ai trouvé d’excellentes avant, mais je ne les vois plus.

Par le pouvoir de Google, j’ai trouvé un blog de 2007 qui donne la regex suivante qui correspond à la chaîne qui ne contient pas une sous-chaîne:

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

Il fonctionne de la manière suivante: il recherche zéro ou plusieurs caractères (.) Qui ne commencent pas (?! – barre de lecture négative) par votre chaîne et stipulent que la chaîne entière doit être composée de tels caractères (en utilisant le ^ et $ anchors). Ou pour le dire autrement:

La chaîne entière doit être composée de caractères qui ne commencent pas par une chaîne donnée, ce qui signifie que la chaîne ne contient pas la sous-chaîne donnée.

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

 regex: /aa.*?aa/ aabbabcaabda => aabbabcaa aaaaaabda => aaaa aabbabcaabda => aabbabcaa aababaaaabdaa => aababaa, aabdaa 

Vous pouvez également utiliser le lookahead négatif, mais dans ce cas-ci, c’est simplement une manière plus verbeuse d’accomplir la même chose. En outre, c’est un peu plus compliqué que gpojd l’a bien compris. Le lookahead doit être appliqué à chaque position avant que le point ne soit autorisé à utiliser le caractère suivant.

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

En ce qui concerne l’approche proposée par Claudiu et finnw, cela fonctionnera bien lorsque la chaîne sentinelle ne compte que deux caractères, mais (comme Claudiu l’a reconnu) elle est trop lourde pour les chaînes plus longues.

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

Je ne suis pas sûr que ce soit une construction standard, mais je pense que vous devriez jeter un coup d’oeil sur “lookahead négatif” (qui écrit: “?!”, Sans les guillemets). C’est beaucoup plus facile que toutes les réponses dans ce fil, y compris celle acceptée.

Exemple: Regex: “^ (?! 123) [0-9] * \ w” Capture toute chaîne commençant par des chiffres suivis de lettres, SAUF si “ces chiffres” sont 123.

http://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx#grouping_constructs (page Microsoft, mais assez complète) pour lookahead / lookbehind

PS: ça marche bien pour moi (.Net). Mais si je me trompe, faites-le nous savoir. Je trouve ce concept très simple et efficace, alors je suis surpris de la réponse acceptée.

J’ai le code suivant que je devais remplacer append un paramètre GET à toutes les références aux fichiers JS SAUF un.

     sendRequest('/application/srvc/EXCEPTION.js', handleChallengeResponse, null); sendRequest('/application/srvc/EXCEPTION.js",handleChallengeResponse, null); 

C’est le Matcher utilisé:

 (? 

Ce que cela fait, c'est de rechercher toutes les occurrences de ".js" et si elles sont précédées par la chaîne "EXCEPTION", supprimez le résultat du tableau de résultats. Cela s'appelle un lookbehind négatif. Depuis que j'ai passé une journée à découvrir comment faire, j'ai pensé que je devais partager.

 ".*[^(\\.inc)]\\.ftl$" 

En Java, tous les fichiers se terminent par “.ftl” mais ne se terminent pas par “.inc.ftl”, ce qui est exactement ce que je voulais.