Elisp regexps ^ dan $ vs `dan '

16

Manual menggambarkan karakter khusus regexp ^dan $. Seperti kebanyakan dialek ekspresi reguler yang saya tahu, mereka sepertinya cocok dengan awal atau akhir sebuah string. Namun, saya juga menemukan bahwa ada `dan 'karakter yang tersedia. Berdasarkan penjelasan yang ditemukan di sini , mereka tampaknya juga cocok dengan awal atau akhir string. Bisakah seseorang menjelaskan perbedaan antara karakter khusus ini, dengan contoh dan rekomendasi kapan menggunakannya?

Ketika saya melihat nilai auto-mode-alist, mereka tampaknya digunakan secara bergantian untuk mencocokkan akhir string:

(...
 ("\\.scss\\'" . scss-mode)
 ("\\.ya?ml$" . yaml-mode)
...)
Jackson
sumber
2
Ketika orang menggunakan $seperti itu, mereka menggunakan nama file yang tidak mengandung baris baru. Ini biasanya akan menjadi asumsi yang sangat aman, tetapi tidak dijamin . \\'Oleh karena itu menggunakan adalah praktik terbaik.
phils

Jawaban:

14

String Anda mungkin memiliki karakter baris baru yang disematkan, dalam hal ini \'cocok dengan akhir string tetapi $cocok sebelum karakter baris baru.

Mengutip manual Elisp, simpul Regexp Special :

Saat mencocokkan string dan bukannya buffer, `$ 'cocok dengan di akhir string atau sebelum karakter baris baru.

Demikian pula, \`cocok dengan awal string, tetapi ^cocok tepat setelah char baris baru. Sekali lagi, manual:

Saat mencocokkan string dan bukannya buffer, `^ 'cocok dengan di awal string atau setelah karakter baris baru.

Jadi untuk string yang biasanya ingin Anda gunakan \`dan \', terutama jika kode Anda tidak dapat mengetahui sebelumnya apakah mungkin ada baris baris baru di string. Untuk teks dalam buffer yang biasanya Anda gunakan ^dan $.

Drew
sumber
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

^dan $cocok dengan awal dan akhir garis .

\`dan \'cocokkan awal dan akhir dari seluruh string .

Jackson
sumber
2
there are ` and ' characters available. [...] they seem to also match the start or end of strings

Karakter khusus adalah: . * + ? ^ $ \ [.

Antara kurung [], berikut ini juga istimewa:] - ^

Banyak karakter termasuk backtick `, dan single quote ', menjadi istimewa ketika mereka mengikuti backslash. Lihat di sini untuk detail lebih lanjut.

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

Ada perbedaan antara beginning of string, dan beginning of each line in the string.

Atas perkenan Ergoemacs. Anda dapat membaca lebih lanjut di sini

Nsukami _
sumber