Jak mogę ustalić, czy bieżącym znakiem jest litera (znak alfabetyczny) (tzn. Należy do klasy składni [:alpha:]
w wyrażeniach regularnych). Chciałbym napisać prostą funkcję jak poniżej:
(defun test-letter () (interactive)
(if char-after-is-a-letter
(message "This is a letter")
(message "This is not a letter")
)
)
Aktualizacja
Niestety moje założenie dotyczące równoważności klasy liter i klasy składni [:alpha:]
wydaje się fałszywe.
elisp
characters
Imię
źródło
źródło
۱۲۳۴۵۶۷۸۹۰
ale istnieją pewne prawdziwe negatywy, np. Arabski lub hebrajski Alef:א
,ا
.五
jest uważany za liczbę5
w języku japońskim. Twój kod uważa to za list. Może to jest litera (jak cyfra rzymskav
). Może ktoś, kto zna japoński, może to zweryfikować.五
jest jak angielskie słowofive
, więc jest literą. Pisząc cyfrę 5 zamiast słowa pięć, używają5
tak jak angielski.EDYCJA: Ta odpowiedź powinna być całkowicie poprawna w 25.5 (tam, gdzie błąd został naprawiony). W przypadku starszych wersji użyj innej opcji .
To powinno ci powiedzieć, czy obecny znak jest literą i powinien działać w dowolnym języku.
źródło
looking-at-p
zastosowanym w twoim rozwiązaniu alooking-at
drugą odpowiedzią.looking-at-p
nie ustawiają danych dopasowania.match-string
(i jego wiele rodzeństwa) zwróci wynik wyszukiwania. Tymczasem w przypadku wersji niep predykatowej łańcuch dopasowania zwróci wynik szukanego dopasowania.Myślę, że możesz uciec od tego:
Aktualizacja
Jest to mniej wydajne, ale bliższe temu, czego chcesz:
źródło
۹
(tj. Cyfrę indyjską 9) lub٪
za literę.ζ
lubα
), ale aktualizacja nie jest.Jeśli bardzo martwiłeś się znakami narodowymi i precyzyjnym traktowaniem klas znaków Unicode, to jedynym rozwiązaniem, jakie udało mi się do tej pory znaleźć, jest
regex
biblioteka Python . Zarównogrep
iPerl
(ku mojemu zdziwieniu!) Nie wykonali poprawnie tej pracy.Tak więc wyrażenie regularne jesteś po to jest jeden:
\p{L}
. Jest to znane jako wersja skrócona właściwości Unicode, pełna wersja jest\p{Letter}
lub nawetp\{General_Category=Letter}
.Letter
sam w sobie jest klasą złożoną, ale nie będę wchodził w szczegóły, najlepsze referencje, jakie mogłem znaleźć na ten temat, są tutaj .Biblioteka języka Python nie jest wbudowana w język (jest alternatywą dla
re
biblioteki wbudowanej ). Więc musisz go zainstalować, na przykład:Następnie możesz użyć go w następujący sposób:
Możesz także umieścić ten skrypt gdzieś, gdzie możesz uzyskać do niego dostęp:
I tak to nazwij Emacsem (załóżmy, że zapisałeś ten skrypt
~/bin
):źródło