文字列が英数字で構成されるかチェックしたい Emacs EmacsLisp
Emacs Lispで文字列を英数字にマッチさせるための正規表現を作る。
(defun my/is-alnum (s) (string-match "^[a-z0-9]+$" s))
マッチすると最初にマッチした文字列の位置が返る。マッチしない場合 nil
になる。
(my/is-alnum "abc123")
0
マッチしない場合も確認しよう。
(my/is-alnum "aa%a")
OK
(my/is-alnum "")
OK
(my/is-alnum "AABB")
0
大文字を指定すると何故かマッチしてしまった。
string-match
のHelpを見てみると理由が書いてあった。
case-fold-search
に nil
を設定しないとignore caseになるらしい。まじか。
Return index of start of first match for REGEXP in STRING, or nil. Matching ignores case if ‘case-fold-search’ is non-nil.
というわけで、修正した。
(defun my/is-alnum-case-fold (s) (let ((case-fold-search nil)) (string-match "^[a-z0-9]+$" s)))
(my/is-alnum-case-fold "AABB")
これでよし。