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


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.


Так же нельзя заменить 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 в покое. Вам не хватает того, что вы хотели?
— Джон Китчин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.