J'utilise RegexBuddy mais j'ai quand même des problèmes avec cette chose: \
Je traite ligne par ligne un fichier. J'ai construit un "modèle de ligne" pour correspondre à ce que je veux.
Maintenant, je voudrais faire une correspondance inverse ... c'est-à-dire que je veux faire correspondre des lignes où il y a une chaîne de 6 lettres, mais seulement si ces six lettres ne sont pas Andrea , comment dois-je faire?
EDIT: J'écrirai le programme qui utilise cette regex, je ne sais pas encore si en python ou php, je fais ce truc d'abord pour apprendre quelques regex :) Il y a différents types de lignes, je voulais utiliser regex pour sélectionner le type qui m'intéresse. Une fois que j'ai ces lignes, je dois appliquer un autre filtre juste pour ne pas correspondre à une valeur connue, j'ai besoin de tous les autres, pas de ça. Le (?! Non-voulu) fonctionne plutôt bien, merci. :-)
J'espère que cela clarifie la question :)
la source
Réponses:
En supposant que votre moteur d'expression régulière prend en charge les anticipations de recherche négatives.
Edit: ..ou peut-être préféreriez-vous utiliser
[A-Za-z]{6}
à la place de.{6}
Edit (encore): Notez que les lookaheads et lookbehinds ne sont généralement pas la bonne façon 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 dans la langue avec laquelle vous les utilisez.
la source
Pour Python / Java,
http://www.lisnichenko.com/articles/javapython-inverse-regex.html
la source
some text
commence la ligne, cela renverra le mauvais résultat.?!
et pas seulement!
.Mis à jour avec les commentaires d' Alan Moore
Dans PCRE et des variantes similaires, vous pouvez en fait créer une expression régulière qui correspond à toute ligne ne contenant pas de valeur:
C'est ce qu'on appelle un jeton gourmand tempéré . L'inconvénient est qu'il ne fonctionne pas bien.
la source
[\s\S]
, ce qui est utile uniquement en JavaScript) après la deuxième préanalyse, et vous n'avez pas besoin le premier:^(?:(?!Andrea).)*$
.[\S\s]
? OP parle de lignes correspondantes, ne contenant pas le mot "Andrea". Il ne s'agit pas de vérifier si la chaîne entière contient ce mot. Est-ce que je manque quelque chose?Quelle langue utilisez-vous? Les capacités et la syntaxe de l'implémentation de regex sont importantes pour cela.
Vous pouvez utiliser l'anticipation. Utiliser python comme exemple
Pour décomposer cela:
(?! Andrea) signifie 'match si les 6 prochains caractères ne sont pas "Andrea"'; si oui alors
\ w signifie un "caractère de mot" - caractères alphanumériques. Ceci est équivalent à la classe [a-zA-Z0-9_]
\ w {6} signifie exactement 6 caractères de mot.
re.IGNORECASE signifie que vous allez exclure "Andrea", "andrea", "ANDREA" ...
Une autre façon est d'utiliser la logique de votre programme - utilisez toutes les lignes qui ne correspondent pas à Andrea et faites-les passer par une deuxième regex pour vérifier 6 caractères. Ou vérifiez d'abord au moins 6 caractères de mot, puis vérifiez qu'il ne correspond pas à Andrea.
la source
Assertion d'anticipation négative
Ce n'est pas exactement une correspondance inversée, mais c'est le mieux que vous puissiez faire directement avec regex. Cependant, toutes les plates-formes ne les prennent pas en charge.
la source
Si vous souhaitez 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 la portée du test sur "Ligne par ligne". Lorsque vous faites cela, un élément Liste toutes les lignes sans correspondance apparaîtra sous le bouton Tout répertorier dans la même barre d'outils. (Si vous ne voyez pas le bouton List All, cliquez sur le bouton Match dans la barre d'outils principale.)
Sur le panneau GREP, vous pouvez activer les cases à cocher «basé sur les lignes» et «inverser les résultats» pour obtenir une liste des lignes non correspondantes dans les fichiers que vous parcourez.
la source
(?!
est utile dans la pratique. Bien qu'à proprement parler, regarder vers l'avenir n'est pas une expression régulière telle que définie mathématiquement.Vous pouvez écrire une expression régulière inversée manuellement.
Voici un programme pour calculer le résultat automatiquement. Son résultat est généré par la machine, qui est généralement beaucoup plus complexe que l'écriture manuelle. Mais le résultat fonctionne.
la source
Je viens de proposer cette méthode qui peut être intensive en matériel mais qui fonctionne:
Vous pouvez remplacer tous les caractères qui correspondent à l'expression régulière par une chaîne vide.
Ceci est un oneliner:
notMatched = re.sub(regex, "", string)
J'ai utilisé cela parce que j'étais obligé d'utiliser une expression régulière très complexe et que je ne pouvais pas comprendre comment inverser chaque partie de celle-ci dans un laps de temps raisonnable.
Cela ne vous renverra que le résultat de la chaîne, pas les objets correspondants!
la source
En perl, vous pouvez faire
process ($ line) if ($ line = ~! / Andrea /);
la source