поддержка регулярных выражений смотреть назад и вперед?

12

Мне нужно выполнить запрос регулярного выражения заменить, так что

fooв foo barсовпадает, но fooв foo bazнет. Обычно я бы использовал регулярное выражение, например foo(?=bar).

Тем не менее, похоже, что Emacs не может сделать это? Vim кажется способным , но злой режим в Spacemacs не может.

Гейзенберг
источник
Также есть следующее: github.com/gamesun/emacs-regex-lookaround , но я не пробовал строить с этим патчем, и, похоже, уже давно.
wvxvw

Ответы:

10

Нет, регулярные выражения Emacs не поддерживают произвольные утверждения упреждения / отсчета нулевой ширины.

nb Evil и Spacemacs (как и все библиотеки elisp) не имеют отношения к вопросам о реализации языка Emacs Lisp.

Phils
источник
Так же нельзя заменить fooв , foobarно не в foobaz? Это достаточно распространенная операция, и я подумал, что должно быть решение. Возможно, смотреть вперед и назад - неправильный подход?
Гейзенберг
Это не является строго эквивалентным, но замена foo\(bar\)на baz\1будет достаточной во всех случаях, когда barне было найдено дальнейших совпадений.
Филс
Если вы пишете elisp, вы обладаете большой гибкостью, и если вы заменяете в интерактивном режиме, вы можете вызывать произвольное elisp во время замены, поэтому в конечном итоге есть способы сделать это. Просто не так удобно, как вы могли бы сделать с этими утверждениями.
Филс
Например: замена fooна \,(if (looking-at "bar") "baz" \&)будет заменять fooна, bazесли следующий текст bar(и заменить fooна в fooпротивном случае). Что по-прежнему не то же самое, что только сопоставление, foo когда за ним следуют bar, но это еще один вариант.
Филс
Я думаю, это похоже на то, что вы сказали выше, но похоже, что вы можете набрать: CSM-% foo \ (bar \) RET FOO \ 1 RET, чтобы заменить весь foo bar на FOO bar, но оставьте все foo baz в покое. Вам не хватает того, что вы хотели?
Джон Китчин