Bagaimana saya dapat menentukan apakah karakter saat ini adalah huruf (karakter alfabet) (yaitu, milik kelas sintaks [:alpha:]
dalam pengertian regexp). Saya ingin menulis fungsi sederhana seperti di bawah ini:
(defun test-letter () (interactive)
(if char-after-is-a-letter
(message "This is a letter")
(message "This is not a letter")
)
)
Pembaruan
Sayangnya, asumsi saya tentang kesetaraan kelas huruf dan kelas sintaksisnya [:alpha:]
keliru.
elisp
characters
Nama
sumber
sumber
۱۲۳۴۵۶۷۸۹۰
tetapi ada beberapa yang benar-negatif, misalnya Arab atau Ibrani Alef:א
,ا
.五
dianggap sebagai angka5
dalam bahasa Jepang. Kode Anda menganggap ini surat. Mungkin itu surat (seperti dalam nomor romawiv
). Mungkin seseorang yang terbiasa dengan bahasa Jepang dapat memverifikasi ini.五
seperti kata bahasa Inggrisfive
, jadi itu adalah huruf. Saat menulis angka 5 dan bukan kata lima, mereka menggunakan5
seperti bahasa Inggris.EDIT: Jawaban ini harus benar-benar valid dalam 25.5 (di mana bug telah diperbaiki). Untuk versi yang lebih lama, gunakan opsi lain .
Ini akan memberi tahu Anda jika karakter saat ini adalah surat, dan harus berfungsi dalam bahasa apa pun.
sumber
looking-at-p
digunakan dalam solusi Anda danlooking-at
jawaban yang lain.looking-at-p
tidak mengatur data kecocokan.match-string
(dan banyak saudara kandungnya) akan mengembalikan hasil pencarian. Sementara itu, dengan versi non-predikat, match-string akan mengembalikan hasil pertandingan yang terlihat.Saya pikir Anda bisa lolos dengan ini:
Memperbarui
Ini kurang efisien, tetapi lebih dekat dengan yang Anda inginkan:
sumber
۹
(yaitu, angka 9 India) atau٪
sebagai surat.ζ
atauα
), tetapi pembaruannya tidak.Jika Anda sangat prihatin tentang karakter nasional dan perlakuan tepat terhadap kelas karakter Unicode, maka satu-satunya solusi yang saya dapat temukan sejauh ini adalah
regex
pustaka Python . Keduanyagrep
danPerl
(mengejutkan saya!) Tidak melakukan pekerjaan dengan benar.Jadi, ekspresi reguler Anda setelah satu ini:
\p{L}
. Ini dikenal sebagai versi steno properti Unicode, versi lengkapnya adalah\p{Letter}
atau bahkanp\{General_Category=Letter}
.Letter
itu sendiri adalah kelas komposit, tapi saya tidak akan pergi ke rincian, referensi terbaik yang bisa saya temukan pada subjek ada di sini .Pustaka Python tidak terintegrasi ke dalam bahasa (ini adalah alternatif untuk
re
pustaka bawaan). Jadi, Anda harus menginstalnya, misalnya:Kemudian, Anda bisa menggunakannya seperti ini:
Anda juga dapat meletakkan skrip ini di suatu tempat di mana Anda dapat mengaksesnya:
Dan panggil saja dari Emacs seperti itu (misalkan Anda menyimpan skrip ini di
~/bin
):sumber