Elisp regexps ^ и $ vs `and '

16

В руководстве описаны специальные символы регулярного выражения ^и $. Как и в большинстве известных мне диалектов регулярных выражений, они соответствуют началу или концу строки. Однако я также обнаружил, что есть `и 'доступные персонажи. Основываясь на найденном здесь объяснении , они, похоже, также соответствуют началу или концу строк. Может кто-нибудь объяснить, пожалуйста, разницу между этими специальными символами, с примером и рекомендацией о том, когда их использовать?

Когда я смотрю на значение auto-mode-alist, они кажутся взаимозаменяемыми, чтобы соответствовать концу строк:

(...
 ("\\.scss\\'" . scss-mode)
 ("\\.ya?ml$" . yaml-mode)
...)
Джексон
источник
2
Когда люди используют $это, они делают ставку на имена файлов, не содержащие символов новой строки. Это , как правило , будет (очень) безопасное предположение, но это не гарантируется . \\'Поэтому использование является лучшей практикой.
Фил

Ответы:

14

Ваша строка может иметь встроенный символ новой строки, и в этом случае \'совпадает с концом строки, но $совпадает непосредственно перед символом новой строки.

Чтобы процитировать руководство Elisp , используйте узел Regexp Special :

Когда сопоставляется строка вместо буфера, `$ 'совпадает в конце строки или перед символом новой строки.

Аналогично, \`совпадает с началом строки, но ^совпадает сразу после символа новой строки. Опять руководство:

Когда сопоставляется строка вместо буфера, `^ 'совпадает в начале строки или после символа новой строки.

Поэтому для строк, которые вы обычно хотите использовать, \`и \'особенно, если ваш код не может знать заранее, могут ли в строке быть символы перевода строки. Для текста в буфере вы обычно используете ^и $.

Нарисовалась
источник
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

^и $сопоставьте начало и конец строк .

\`и \'сопоставьте начало и конец всей строки .

Джексон
источник
2
there are ` and ' characters available. [...] they seem to also match the start or end of strings

Специальные символы: . * + ? ^ $ \ [.

Между скобками []также есть следующие особенности:] - ^

Многие символы, включая backtick `и одинарные кавычки ', становятся особенными, когда они следуют за обратной косой чертой. Смотрите здесь для более подробной информации.

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

Есть разница между beginning of string, и beginning of each line in the string.

Предоставлено Ergoemacs. Вы можете прочитать больше здесь

Нсуками _
источник