はじめに
半角英数字のみを許容する入力フォームのバリデーション等で以下の正規表現を用いることがあるかもしれません。
^[0-9a-zA-Z]+$
これを間違えて標題のように記載するとどうなるでしょう?
この正規表現であれば、言語を問わず同じだと思うのですが、念の為、javascriptとします。
というのが、この記事のお話です。
なにが違うかを念のため記載すると、アルファベットの最後のzが小文字になっています。
^[0-9a-zA-z]+$
答え
以下を1文字以上含む文字列にマッチします。
つまり、本来除外したかった記号も含んでしまいます。
分類 | 内容 |
---|---|
数字 | 0123456789 |
アルファベット小文字 | abcdefghijklmnopqrstuvwxyz |
アルファベット大文字 | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
一部の記号 | [\]^_` |
解説
A-z
をASCIIコード(10進数)で表すと65-122
となります。
A
からz
までには、アルファベット大文字小文字の52個以外に何かが6個追加されているのです。
以下がその何かです。
10進数 | ... | 65 | ... | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | ... | 122 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
文字 | ... | A | ... | Z | [ | \ | ] | ^ | _ | ` | a | ... | z |
※ 並び順はUnicodeも同じです。
おまけ
javascriptにはありませんが、rubyやjava, kotlinでは、正規表現の減算表現があります。
例えば、正規表現で、\w
は[A-Za-z0-9_]
に相当し、半角英数字とアンダースコアにマッチします。半角英数字のみにマッチさせたい場合は使用できないわけです。
ところが、以下のように記載すると1アンダースコアを抜くこと(減算)ができ、半角英数字のみにマッチします。
^[\w&&[^_]]+$
追記
javascriptでもアンダースコアを抜く方法があることを@ss8826 さんに教えていただきました。\w
の否定の\W
を用いる方法です。
こちらの方が短くて他の言語でも使用できますね。
詳細はコメントを参照下さい。
^[^\W_]+$
参考
正規表現のチェックには、以下のサイトを使用しました。
-
java, kotlinでは、バックスラッシュに対しエスケープが必要です。 ↩