Tak więc, używając konstruktora wyrażeń regularnych (re-builder Mx), znajdowanie linii kończących się na \ wymaga „\\ $”, podczas gdy wyszukiwanie i zamiana na wyrażenie regularne zajmuje tylko „\ $”. Oczekiwałem, że konstruktor wyrażeń regularnych będzie budował wyrażenia bezpośrednio użyteczne, więc co tłumaczy tę różnicę?
elisp
regular-expressions
użytkownik2699
źródło
źródło
reb-query-replace
definicję funkcji.Odpowiedzi:
W rzeczywistości istnieją cztery różne
re-builder
opcje składni i możesz się między nimi przełączaćC-cTABDwa dotyczą kompilatorów regularnych typu sexp
rx
isregex
(ponieważ ten pierwszy jest bardziej wszechstronny i prawie całkowicie kompatybilny ze składnią, możesz naprawdę zignorować sregex, chyba że pracujesz ze starym kodem, który go używał).Pozostałe dwie opcje składni to
read
(domyślna) istring
(której składni używasz interaktywnie).read
Składnia jest składnia „kod” - czyli jak rozpoznawane przez czytnik lisp - w którym wchodzi się do wyrażenia regularnego jak na składni czytać ciągi :C-hig
(elisp) Syntax for Strings
RETstring
Składnia (które zawsze uważane za nazwę niepotrzebnie mylące w tym kontekście) jest składnia wyrażeń regularnych ciąg , który już został odczytany , a zatem nie ma żadnego z charakterem wymagane uwalnianych podczas pisania ciąg. To znaczy, że jest to rzeczywista składnia wyrażeń regularnych, taka sama, jakiej używasz, gdy Emacs monituje Cię interaktywnie.Jeśli chcesz domyślnie używać składni łańcuchów, dodaj następujące pliki do pliku init lub użyj M-x
customize-option
RETreb-re-syntax
RETZauważ, że podczas edycji wyrażenia regularnego możesz przełączać się między składnią odczytu i składnią ciągów, bez utraty danych. Możesz także przełączyć się z formularzy sexp na składnię read / string (naturalnie; kompilacja sexps do łańcuchów jest tym, do czego służą te biblioteki), ale nie możesz iść w innym kierunku i generować sexp z łańcucha. re-builder pamięta, co to był sexp, więc nie tracisz tej formy po zmianie składni; ale nie zostanie również zaktualizowany, jeśli zmodyfikujesz wyrażenie regularne w innej składni, a następnie zmienisz z powrotem. Krótko mówiąc, jeśli budujesz wyrażenie regularne jako sexp, upewnij się, że edytujesz go tylko przy użyciu tej składni.
Gotcha ze
rx
wsparciem polega na tym, że faktycznie używarx-to-string
funkcji, która nie jest całkiem identyczna z użyciemrx
makra w kodzie.rx
akceptuje dowolną liczbę argumentów postaci i traktuje je jako dorozumianą sekwencję , podczas gdyrx-to-string
akceptuje tylko jedną formę, a każda sekwencja najwyższego poziomu musi być jawna za pomocą'(sequence ...)
lub równoważna.Krótko mówiąc, po wprowadzeniu formularza
'(...)
w programie do przebudowy jest on przetwarzany jako(rx-to-string '(...))
i nie(rx ...)
Należy również pamiętać, że niepoprawny formularz może spowodować,
re-builder
że przestanie on dynamicznie aktualizować dopasowania w powiązanym buforze, nawet po ponownym zatwierdzeniu formularza. C-cC-uDo wiązaniareb-force-update
jest przydatna do rozwiązywania takich sytuacji.Domyślnie wiersz trybu pokazuje „RE Builder” przy użyciu
read
lubstring
składni oraz „RE Builder Lisp” przy użyciurx
lubsregex
składni, ale wydaje się znacznie bardziej użyteczne określenie konkretnej używanej składni (szczególnie w celu rozróżnienia międzyread
istring
).Jeśli instalujesz
delight
pakiet z GNU ELPA, możesz użyć następujących poleceń, aby dodać wskaźnik składni do wiersza trybu.Zmienia to nazwę trybu na „Regexp [czytaj]” w
read
składni i podobnie dla pozostałych.Lub w celu dołączenia podpowiedzi do opisanej powyżej funkcji
rx
vs,rx-to-string
ustaw linię trybu na „Regexp [rx-to-string]” przy użyciurx
składni:źródło