Elisp regexps ^ і $ vs `і '


16

Посібник описує спеціальні символи regexp ^та $. Як і у більшості діалектів регулярних виразів, які я знаю, вони, здається, відповідають початковій чи кінці рядка. Однак я також виявив, що є `і 'персонажі. Виходячи з знайденого тут пояснення , вони, здається, також відповідають початковій чи кінці рядків. Чи не могли б хтось пояснити різницю між цими спеціальними символами, прикладом та рекомендацією щодо їх використання?

Коли я дивлюсь на значення 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

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

Між дужками []також є спеціальні:] - ^

Багато символів, включаючи зворотний відбіток `та одинарну цитату ', стають особливими, коли слідують за зворотним нахилом. Дивіться тут для більш детальної інформації.

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. Більше ви можете прочитати тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.