wsparcie dla wyrażenia regularnego patrzeć w tył i do przodu?


12

Muszę wykonać zamianę wyrażenia regularnego, np

foow foo bardopasowane, ale foow foo baznie. Zwykle użyłbym wyrażenia regularnego, np foo(?=bar).

Wydaje się jednak, że Emacs nie może tego zrobić? Vim wydaje się zdolny , ale tryb zła w kosmicznych maczugach nie.


Jest też: github.com/gamesun/emacs-regex-lookaround , ale nie próbowałem budować z tą łatką i wygląda na to, że minęło trochę czasu.
wvxvw

Odpowiedzi:


10

Nie, wyrażenia regularne Emacsa nie obsługują arbitralnych asercji przewidywania zerowej szerokości.

nb Złe i Spacemacs (jak wszystkie biblioteki elisp) nie mają znaczenia, jeśli chodzi o pytania dotyczące implementacji języka Emacs Lisp.


Więc jest to niemożliwe, aby wymienić foosię foobarjednak nie foobaz? Jest to dość powszechna operacja, która moim zdaniem musi być rozwiązaniem. Być może niewłaściwe podejście jest złe?
Heisenberg

Nie jest to ściśle równoważne, ale zastąpienie foo\(bar\)go baz\1będzie wystarczające we wszystkich przypadkach, w których barnie zawierały dalszych dopasowań.
phils

Jeśli piszesz elisp, masz dużą elastyczność, a jeśli zastępujesz interaktywnie, możesz przywoływać dowolny elisp podczas zamiany, więc ostatecznie istnieją sposoby, aby to zrobić. Po prostu nie tak wygodnie, jak możesz zrobić z tymi twierdzeniami.
phils

np .: zastąpienie fooprzez \,(if (looking-at "bar") "baz" \&)spowoduje zastąpienie fooprzez, bazjeśli następujący tekst to bar(i zastąp foow fooinnym przypadku). Co wciąż nie jest tym samym, co dopasowanie tylko foowtedy, gdy następuje bar, ale jest to inna opcja.
phils

Wydaje mi się, że to tak, jak powiedziałeś powyżej, ale wygląda na to, że możesz wpisać: CSM-% foo \ (bar \) RET FOO \ 1 RET, aby zastąpić wszystkie paski foo pasami FOO, ale zostaw foo baz w spokoju. Czy brakuje czegoś, czego chciałeś?
John Kitchin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.