답변:
이것은 분명히 작동해야합니다.
(memq (get-char-code-property (char-after) 'general-category)
'(Ll Lu Lo Lt Lm Mn Mc Me Nl))
보너스는 또한보다 빠릅니다 looking-at
.
Emacs는 유니 코드 표준으로 지정된 모든 문자 속성을 저장 합니다. 로 액세스 할 수 있습니다 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
일치 데이터를 설정하지 않는 것을 제외하고 두 기능은 동일 합니다.
match-string
(및 그 많은 형제) 검색 결과를 반환합니다. 한편, 술어가 아닌 버전의 경우, match-string은 찾는 일치 결과를 리턴합니다.
나는 당신이 이것으로 벗어날 수 있다고 생각합니다.
(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) 또는 ٪
문자로 간주됩니다.
ζ
또는 α
) 로 훌륭 했지만 업데이트는 아닙니다.
국가 문자와 유니 코드 문자 클래스의 정확한 처리에 대해 매우 우려하는 경우 지금까지 내가 찾은 유일한 솔루션은 Python regex
라이브러리 입니다. 둘 다 grep
와 Perl
(나의 완전한 놀랍게도!) 제대로 일을하지 않았다.
따라서 다음에 오는 정규식은 다음과 같습니다 \p{L}
. 이것은 유니 코드 속성 속기 버전으로 알려져 있으며 정식 버전은 \p{Letter}
또는 짝수 p\{General_Category=Letter}
입니다. Letter
그 자체는 복합 클래스이지만 자세한 내용은 다루지 않겠습니다 . 주제에 대한 최상의 참조는 여기 입니다.
파이썬 라이브러리는 언어에 내장되어 있지 않습니다 (내장 라이브러리의 대안입니다 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)))
۱۲۳۴۵۶۷۸۹۰
하지만 아랍어 또는 히브리어 Alef와 같은 진정한 부정이 있습니다 :א
,ا
.