soutien pour regex regarder derrière et devant?

12

J'ai besoin d'effectuer un remplacement de requête regex, de telle sorte que

fooin foo barcorrespond, mais fooin foo bazne l'est pas. Normalement, j'utiliserais l'expression régulière regex, par exemple foo(?=bar).

Cependant, il semble qu'Emacs ne puisse pas faire cela? Vim semble capable , mais le mode diabolique dans les spacemacs ne le peut pas.

Heisenberg
la source
Il y a aussi ceci: github.com/gamesun/emacs-regex-lookaround , mais je n'ai pas essayé de construire avec ce patch, et il semble que cela fait un moment.
wvxvw

Réponses:

10

Non, les expressions régulières Emacs ne prennent pas en charge les assertions arbitraires d'anticipation / de largeur nulle.

nb Evil et Spacemacs (comme toutes les bibliothèques elisp) ne sont pas pertinents lorsqu'il s'agit de questions sur l'implémentation du langage Emacs Lisp.

phils
la source
Est-il donc impossible de remplacer fooen foobarmais pas en foobaz? C'est une opération assez courante pour que je pense qu'il doit y avoir une solution. Peut-être que regarder en avant et en arrière est la mauvaise approche?
Heisenberg
Ce n'est pas strictement équivalent, mais le remplacement foo\(bar\)par baz\1suffira dans tous les cas où barne contient pas d'autres correspondances.
phils
Si vous écrivez elisp, vous avez beaucoup de flexibilité, et si vous remplacez de manière interactive, vous pouvez invoquer elisp arbitraire pendant les remplacements, donc finalement il y a des façons de faire ces choses. Tout simplement pas aussi commodément que vous pourriez le faire avec ces affirmations.
phils
par exemple: remplacer foopar \,(if (looking-at "bar") "baz" \&)remplacera foopar bazsi le texte suivant est bar(et remplacez foopar foosinon). Ce qui n'est toujours pas la même chose que d' apparier uniquement fooquand c'est suivi bar, mais c'est une autre option.
phils
Je suppose que cela ressemble à ce que vous avez dit ci-dessus, mais il semble que vous pouvez taper: CSM-% foo \ (bar \) RET FOO \ 1 RET pour remplacer tous les foo bar par FOO bar, mais laissez tous les foo baz seuls. Manque-t-il quelque chose que vous vouliez?
John Kitchin