web-dev-qa-db-fra.com

Comment "faire l'inverse" avec regex?

J'utilise RegexBuddy mais j'ai quand même des problèmes avec cette chose: \

Je traite un fichier ligne par ligne. J'ai construit un "modèle de ligne" pour correspondre à ce que je veux.

Maintenant, je voudrais faire une correspondance inverse ... c.-à-d. Je veux faire correspondre les lignes où il y a une chaîne de 6 lettres, mais seulement si ces six lettres sont pas Andrea, comment dois-je faire cette?


EDIT: Je vais écrire le programme qui utilise cette regex, je ne sais pas encore si en python ou php, je fais cette chose d'abord pour apprendre quelques regex :) Il existe différents types de ligne, je voulais utiliser regex pour sélectionner le type qui m’intéresse. Une fois ces lignes saisies, je dois appliquer un autre filtre pour ne pas correspondre à une valeur connue, j’ai besoin de tous les autres, pas de cela. Le (?! Non-wanted) fonctionne assez bien, merci. :-)

J'espère que cela clarifie la question :)

89
Andrea Ambu
(?!Andrea).{6}

En supposant que votre moteur regexp prenne en charge les valeurs négatives.

Edit: ..ou peut-être préférez-vous utiliser [A-Za-z]{6} à la place de .{6}

Modifier (à nouveau): notez que les marques d'anticipation et de recherche ne sont généralement pas le bon moyen "d'inverser" une correspondance d'expression régulière. Les expressions régulières ne sont pas vraiment configurées pour faire des correspondances négatives, elles laissent cela à la langue dans laquelle vous les utilisez.

56
Dan
43
Dmytro

Mis à jour avec les retours de Alan Moore

Dans PCRE et des variantes similaires, vous pouvez créer une expression rationnelle qui correspond à toute ligne ne contenant pas de valeur:

^(?:(?!Andrea).)*$

Cela s'appelle un jeton gourmand tempéré . L'inconvénient est qu'il ne fonctionne pas bien.

15
Zenexer

Quelle langue utilisez-vous? Les capacités et la syntaxe de l’implémentation de regex importent à cet égard.

Vous pouvez utiliser l'anticipation. Utiliser python comme exemple

import re

not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE)

Pour décomposer cela:

(?! Andrea) signifie 'correspond si les 6 prochains caractères ne sont pas "Andrea"'; si oui alors

\w signifie un "caractère Word" - caractères alphanumériques. Ceci est équivalent à la classe [a-zA-Z0-9_]

\w {6} signifie exactement 6 caractères Word.

re.IGNORECASE signifie que vous excluez "Andrea", "andrea", "ANDREA" ...

Une autre façon consiste à utiliser la logique de votre programme - utilisez toutes les lignes ne correspondant pas à Andrea et mettez-les dans une deuxième expression rationnelle pour vérifier si 6 caractères sont présents. Ou vérifiez d’abord au moins 6 caractères Word, puis vérifiez qu’il ne correspond pas à Andrea.

10
Hamish Downer

Affirmation négative d'anticipation

(?!Andrea)

Ce n'est pas exactement une correspondance inversée, mais c'est le mieux que vous puissiez faire directement avec regex. Cependant, toutes les plateformes ne les prennent pas en charge.

5
Vinko Vrsalovic

Si vous voulez faire cela dans RegexBuddy, il existe deux façons d'obtenir une liste de toutes les lignes ne correspondant pas à une expression régulière.

Dans la barre d'outils du panneau Test, définissez l'étendue du test sur "Ligne par ligne". Lorsque vous faites cela, un élément Répertorier toutes les lignes sans correspondance apparaît sous le bouton Répertorier tout dans la même barre d’outils. (Si vous ne voyez pas le bouton Tout lister, cliquez sur le bouton Correspondance dans la barre d'outils principale.)

Sur le panneau GREP, vous pouvez activer les cases à cocher "basé sur la ligne" et "inverser les résultats" pour obtenir une liste des lignes non correspondantes dans les fichiers que vous parcourez.

4
Jan Goyvaerts

(?! est utile en pratique . Bien que, à proprement parler, regarder vers l'avenir ne soit pas une expression régulière au sens mathématique.

Vous pouvez écrire une expression régulière inversée manuellement.

Voici un programme pour calculer automatiquement le résultat . Son résultat est généré par une machine, ce qui est généralement beaucoup plus complexe que d'écrire à la main . Mais le résultat fonctionne.

3
weakish