LoginSignup
2
3

正規表現 ^[0-9a-zA-z]+$ がマッチする文字列は?

Last updated at Posted at 2023-10-01

はじめに

半角英数字のみを許容する入力フォームのバリデーション等で以下の正規表現を用いることがあるかもしれません。

^[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_]+$

参考

正規表現のチェックには、以下のサイトを使用しました。

  1. java, kotlinでは、バックスラッシュに対しエスケープが必要です。

2
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3