Unterstützung für Regex nach hinten und nach vorne schauen?

12

Ich muss Regex-Abfrage ersetzen, so dass

fooin foo barist übereinstimmend, fooin foo bazjedoch nicht. Normalerweise würde ich Regex Look Ahead verwenden, z foo(?=bar).

Es scheint jedoch, dass Emacs dies nicht kann? Vim scheint fähig zu sein , aber der böse Modus in Spacemacs kann es nicht.

Heisenberg
quelle
Es gibt auch Folgendes : github.com/gamesun/emacs-regex-lookaround , aber ich habe nicht versucht, mit diesem Patch zu erstellen, und es sieht so aus, als wäre es eine Weile her.
wvxvw

Antworten:

10

Nein, reguläre Emacs-Ausdrücke unterstützen keine willkürlichen Vorausschau- / Hinter-Behauptungen mit einer Breite von Null.

nb Evil und Spacemacs (wie alle elisp-Bibliotheken) spielen bei Fragen zur Implementierung der Emacs Lisp-Sprache keine Rolle.

Phils
quelle
So ist es unmöglich , zu ersetzen , fooin foobaraber nicht in foobaz? Dies ist eine Operation, die häufig genug ist, dass ich dachte, es müsste eine Lösung geben. Vielleicht ist ein Blick nach vorne und hinten der falsche Ansatz?
Heisenberg
Dies ist nicht unbedingt gleichwertig, aber das Ersetzen foo\(bar\)durch baz\1ist in allen Fällen ausreichend, in denen barkeine weiteren Übereinstimmungen enthalten waren.
Phils
Wenn Sie elisp schreiben, haben Sie viel Flexibilität, und wenn Sie interaktiv ersetzen, können Sie beim Ersetzen beliebiges elisp aufrufen. Letztendlich gibt es also Möglichkeiten, diese Dinge zu tun. Nur nicht so bequem, wie Sie es mit diesen Behauptungen tun könnten.
Phils
zB: Austausch foomit \,(if (looking-at "bar") "baz" \&)ersetzen foomit , bazwenn der folgende Text ist bar(und ersetzen foomit fooanderen Gründen ). Was immer noch nicht dasselbe ist wie nur Matching, foo wenn es folgt bar, aber es ist eine andere Option.
Phils
Ich denke, das ist wie das, was Sie oben gesagt haben, aber es scheint, als könnten Sie Folgendes eingeben: CSM-% foo \ (bar \) RET FOO \ 1 RET, um alle foo-Leisten durch FOO-Leisten zu ersetzen, aber lassen Sie alle foo baz in Ruhe. Fehlt Ihnen etwas, was Sie wollten?
John Kitchin