Last update: 2023-11-21

文字列が英数字で構成されるかチェックしたい   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-searchnil を設定しないと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")

これでよし。