回答:
これは間違いなく動作するはずです:
(memq (get-char-code-property (char-after) 'general-category)
'(Ll Lu Lo Lt Lm Mn Mc Me Nl))
ボーナスとして、それはまたより速いはずですlooking-at
。
Emacsは、Unicode標準で指定されたすべての文字プロパティを格納します。でアクセスできますget-char-code-property
。具体的には、general-category
プロパティはどの文字が文字であるかを指定します(Ll
小文字でLu
大文字で、他の文字については尋ねません)。
五
の数字と見なされ5
ます。あなたのコードはこれを手紙とみなします。多分それは手紙です(ローマ数字のようにv
)。たぶん日本語に詳しい人ならこれを確認できるでしょう。
五
は英語の単語のfive
ようで、文字です。5という単語の代わりに5を書くとき、彼らは5
英語のように使用します。
編集:この回答は25.5(バグが修正されていた)では完全に有効です。古いバージョンの場合は、他のオプションを使用してください。
これにより、現在の文字が文字であるかどうかがわかり、どの言語でも機能するはずです。
(looking-at-p "[[:alpha:]]")
looking-at-p
あなたの解決策とlooking-at
他の答えで使用された違いに興味があります。
looking-at-p
一致データを設定しないことを除いて、2つの関数は同等です。
match-string
(およびその多くの兄弟)は、検索結果を返します。一方、非述語バージョンでは、match-stringは、looking-atマッチの結果を返します。
私はあなたがこれで逃げることができると思います:
(defun test-letter ()
(interactive)
(let ((char (char-after)))
(if (and (eq (char-syntax char) ?w)
(or (> char ?9)
(< char ?1)))
(message "This is a letter")
(message "This is not a letter"))))
これは効率は落ちますが、あなたが望むものに近いです:
(defun test-letter ()
(interactive)
(if (looking-at "[a-z-A-Z]")
(message "This is a letter")
(message "This is not a letter")))
۹
(インドの数字9)または٪
文字と見なされます。
ζ
またはなどα
)で問題ありませんでしたが、更新はそうではありません。
国別文字とUnicode文字クラスの正確な扱いについて非常に懸念している場合、私がこれまでに見つけた唯一の解決策はPython regex
ライブラリです。grep
とPerl
(私の驚いたことに!)両方が適切に仕事をしませんでした。
したがって、あなたが求めている正規表現は次のとおり\p{L}
です。これはUnicodeプロパティの短縮形として知られており、完全版は\p{Letter}
またはp\{General_Category=Letter}
です。 Letter
それ自体は複合クラスですが、詳細には触れません。この件に関して私が見つけた最良のリファレンスはここにあります。
Pythonライブラリは言語に組み込まれていません(組み込みライブラリの代替re
です)。したがって、たとえば次のようにインストールする必要があります。
# pip install regex
その後、次のように使用できます。
import regex
>>> regex.match(ur'\p{L}+', u'۱۲۳۴۵۶۷۸۹۰')
>>> regex.match(ur'\p{L}+', u'абвгд')
<regex.Match object; span=(0, 5), match=u'\u0430\u0431\u0432\u0433\u0434'>
>>> regex.match(ur'\p{L}+', u'123')
>>> regex.match(ur'\p{L}+', u'abcd')
<regex.Match object; span=(0, 4), match=u'abcd'>
>>>
このスクリプトは、アクセスできる場所に置くこともできます。
#!/usr/bin/env python
import regex
import sys
if __name__ == "__main__":
for match in regex.finditer(ur'\p{L}+', sys.argv[1].decode('utf-8')):
print match.string
そして、Emacsから次のように呼び出します(このスクリプトをに保存したとします~/bin
)。
(defun unicode-character-p ()
(interactive)
(let* ((current (char-after (point)))
(result (shell-command-to-string
(format "~/bin/is-character.py '%c'" current))))
(message
(if (string= result "") "Character %c isn't a letter"
"Character %c is a letter")
current)))
۱۲۳۴۵۶۷۸۹۰
ますが、いくつかの真の陰性、例えばアラビア語やヘブライ語のアレフがありますא
、ا
。