Elisp regexps ^ i $ vs `i '

16

Podręcznik opisuje regexp znaków specjalnych ^i $. Podobnie jak w większości dialektów wyrażeń regularnych, które znam, wydają się pasować do początku lub końca łańcucha. Jednak odkryłem również, że są dostępne `i 'postacie. W oparciu o wyjaśnienie tutaj , wydaje się, że pasują również do początku lub końca ciągów. Czy ktoś mógłby wyjaśnić różnicę między tymi znakami specjalnymi, podając przykład i zalecenie, kiedy ich użyć?

Kiedy patrzę na wartość auto-mode-alist, wydaje się, że są one używane zamiennie, aby dopasować koniec ciągów:

(...
 ("\\.scss\\'" . scss-mode)
 ("\\.ya?ml$" . yaml-mode)
...)
Jackson
źródło
2
Kiedy ludzie $tak używają, korzystają z nazw plików niezawierających nowych linii. Jest to zazwyczaj będzie to (bardzo) bezpieczne założenie, ale nie jest gwarantowana . Korzystanie \\'jest zatem najlepszą praktyką.
phils

Odpowiedzi:

14

Łańcuch może mieć osadzony znak nowej linii, w którym to przypadku \'pasuje do końca łańcucha, ale $pasuje tuż przed znakiem nowej linii.

Aby zacytować instrukcję Elisp, węzeł Regexp Special :

Podczas dopasowywania łańcucha zamiast bufora `$ 'dopasowuje się na końcu łańcucha lub przed znakiem nowej linii.

Podobnie, \`dopasowuje początek łańcucha, ale ^dopasowuje zaraz po znaku nowej linii. Ponownie instrukcja:

Podczas dopasowywania łańcucha zamiast bufora, `^ 'pasuje na początku łańcucha lub po znaku nowej linii.

Więc w przypadku ciągów znaków, których zwykle chcesz używać, \`a \'zwłaszcza jeśli Twój kod nie może z góry wiedzieć, czy w łańcuchu mogą znajdować się znaki nowej linii. Dla tekstu w buforze zwykle używasz ^i $.

Rysował
źródło
6
(string-match "^foo" "foo")         ; => 0
(string-match "\\`foo" "foo")       ; => 0
(string-match "^foo" "bar\nfoo")    ; => 4
(string-match "\\`foo" "bar\nfoo")  ; => nil

(string-match "foo$" "foo")         ; => 0
(string-match "foo\\'" "foo")       ; => 0
(string-match "foo$" "foo\nbar")    ; => 0
(string-match "foo\\'" "foo\nbar")  ; => nil

^i $dopasuj początek i koniec linii .

\`i \'dopasuj początek i koniec całego łańcucha .

Jackson
źródło
2
there are ` and ' characters available. [...] they seem to also match the start or end of strings

Znaki specjalne są: . * + ? ^ $ \ [.

Między nawiasami []szczególne są również:] - ^

Wiele znaków, w tym backtick `i single quote ', stają się wyjątkowe, gdy podążają za odwrotnym ukośnikiem. Zobacz tutaj po więcej szczegółów.

Could someone please explain the difference between these special characters, with an example and recommendation on when to use them?

Istnieje różnica między beginning of string, a beginning of each line in the string.

Dzięki uprzejmości Ergoemacs. Możesz przeczytać więcej tutaj

Nsukami _
źródło