Comment puis-je écrire une expression régulière qui exclut plutôt que de matchs, par exemple, de ne pas (ce|chaîne)?
Je suis perplexe, essayant de créer un Emacs expression régulière qui exclut des groupes. [^]
exclut les caractères individuels dans un ensemble, mais je veux exclure certains séquences de caractères: quelque chose comme [^(not|this)]
, de sorte que les chaînes de caractères contenant "pas" ou "ce" ne sont pas appariés.
En principe, je pourrais écrire ([^n][^o][^t]|[^...])
, mais est-il une autre façon qui est plus propre?
- Je pense que c'est GNU ERE.
- vous avez raison, merci
- Cliquez sur le "regex négation" tag pour voir certaines des questions similaires.
- Il existe un patch (non accepté) pour les assertions avant ce qui rend cela possible: debbugs.gnu.org/db/53/5393.html
Vous devez vous connecter pour publier un commentaire.
Tout d'abord:
[^n][^o][^t]
n'est pas une solution. Cela permettrait également d'exclure des mots commenil
([^n]
ne correspond pas),bob
([^o]
ne correspond pas) oucat
([^t]
ne correspond pas).Mais il est possible de construire une expression régulière avec la syntaxe de base qui correspond à des chaînes qui ne contiennent
not
nithis
:Le motif de cette expression régulière est de permettre à tout caractère qui n'est pas le premier caractère des mots ou uniquement les préfixes des mots, mais pas l'ensemble des mots.
Ce n'est pas facilement possible. Les expressions régulières sont conçus pour match choses, et c'est tout ce qu'ils peuvent faire.
Tout d'abord:
[^]
ne désigne pas un "exclut le groupe", il désigne une niée classe de personnage. Les classes de caractères ne pas prendre en charge le regroupement sous quelque forme ou la forme. Ils soutiennent les caractères simples (et, pour des raisons de commodité, les plages de caractères). Votre essayez[^(not|this)]
est 100% équivalent à[^)(|hinots]
, autant que le moteur d'expressions régulières est concerné.Trois façons peut entraîner de sortir de cette situation:
(not|this)
et exclure toutes les correspondances avec l'aide de l'environnement, vous êtes en (annuler les résultats des matchs)M
+X
keep-lines
à abandonner les lignes qui ne correspondent pas à ce que vous voulez.Difficile de croire que l'on a accepté de répondre (à partir de Gumbo) a effectivement été accepté! Sauf s'il a été accepté, car il indique que vous ne peut pas faire ce que vous voulez. Sauf si vous avez une fonction qui génère de telles expressions régulières (comme Gumbo montre), la composition serait une vraie douleur.
Quel est le réel de cas d'utilisation -- ce que vous êtes vraiment essayer de faire?
Comme Tomalak indiqué, (un) ce n'est pas ce que les expressions régulières ne; (b) voir l'autre post, il est lié pour une bonne explication, y compris quoi faire au sujet de votre problème.
La réponse est d'utiliser une expression régulière pour correspondre à ce que vous ne pas voulez, et puis soustrayez du domaine initial. OIE, ne pas essayer de faire de la regexp ne l'exclusion (on ne peut pas); faire de l'exclusion après à l'aide d'une expression régulière correspond à ce que vous souhaitez exclure.
C'est ainsi que chaque outil qui utilise les expressions régulières (par exemple,
grep
): ils offrent une option distincte (par exemple, via la syntaxe) qui effectue la soustraction -- après la mise en correspondance de ce qui doit être soustrait.Il semble que vous essayez de faire anticipation négatif. c'est à dire que vous essayez d'arrêter de correspondance une fois que vous atteignez certains délimiteur.
Emacs ne supporte pas d'anticipation directement, mais il prend en charge les non-greedy version de l'*, + et ? les opérateurs (*?, +?, ??), qui peut être utilisé pour le même but, dans la plupart des cas.
Ainsi, par exemple, pour rechercher le corps de cette fonction javascript:
Vous pouvez utiliser cette emacs regex:
Ici nous sommes à l'arrêt une fois que nous trouvons les deux élément de la séquence "};". [[:ascii:]] est utilisé au lieu de l'opérateur "." parce qu'elle travaille sur plusieurs lignes.
C'est un peu différente de celle d'anticipation négatif, parce que le }; séquence elle-même qu'elle correspond, en revanche, si votre but est d'extraire tout le contenu jusqu'à ce point, il vous suffit d'utiliser une capture d'un groupe \( et \).
Voir emacs regex manuel: http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexps.html
Comme une note de côté, si vous l'écriture de tout type d'emacs regex, assurez-vous d'invoquer M-x re-builder, ce qui apportera un peu d'IDE pour la rédaction de votre regex contre le tampon courant.
Essayer de M-x au ras des lignes.
Pour les cas d'utilisation de l'association d'une chaîne de test logique, je fais ceci:
J'ai utiliser cette méthode pour éviter le bug de la fonction que j'ai discuté Ici: