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.

Heisenberg
źródło
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.

phils
źródło
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