підтримка для регулярного виразу дивитися позаду і вперед?


12

Мені потрібно виконати заміни регулярного виразу, таким, що

fooв foo barзбігається, але fooв foo bazні. Зазвичай я б використовував регулярний вигляд заздалегідь, наприклад foo(?=bar).

Однак, схоже, Emacs не може цього зробити? Vim здається дієздатним , але злий режим у космосах не може.


Є також таке: 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 на панель FOO, але залишити всі foo baz у спокої. Чи не вистачає цієї речі, яку ви хотіли?
Джон Кітчін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.