【JavaScript】半角英数字かどうかをチェックする方法

フォームのID・ユーザー名・パスワードなどで、入力が半角英数字だけで構成されているかを確認したい場面はよくあります。これは正規表現一行で判定できます。

ポイントは、全角の英数字(012ABC)は半角英数字に含まれないこと、そして空文字の扱いです。この記事では、つまずきやすい点を押さえながら解説します。

この記事の結論:半角英数字の判定は /^[a-zA-Z0-9]+$/.test(str) でできます。* ではなく + を使うと空文字を弾けます。全角の英数字(0AB)は [a-zA-Z0-9] に一致しないため、自動的に false になります。
スポンサーリンク

半角英数字とは(全角との違い)

半角英数字とは、半角のアルファベット(a〜z・A〜Z)と数字(0〜9)のことです。いずれもASCIIに含まれる文字で、正規表現の [a-zA-Z0-9] で表せます。

  • Hello123 / abc / 2024 … 半角英数字
  • こんにちは / Hello 123(スペース込み) … 半角英数字ではない
  • 012 / ABC(全角) … 見た目は似ていても別物で対象外

正規表現でチェックする

文字列全体が半角英数字かどうかは、先頭 ^ から末尾 $ までを[a-zA-Z0-9] で囲って判定します。

JavaScript:半角英数字の判定
function isAlphanumeric(str) {
  return /^[a-zA-Z0-9]+$/.test(str);
}

isAlphanumeric("Hello123"); // true
isAlphanumeric("12345");    // true(数字のみ)
isAlphanumeric("abcDEF");   // true(英字のみ)
isAlphanumeric("Hello 123");// false(スペースを含む)
isAlphanumeric("こんにちは"); // false(日本語を含む)
* と + の違い(空文字の扱い):/^[a-zA-Z0-9]*$/ のように *(0文字以上)を使うと、空文字 "" も true になってしまいます。「1文字以上の入力が半角英数字か」を見たいなら、+(1文字以上)を使ってください。

全角の英数字は弾かれる(半角限定の確認)

このテーマで最も重要なのが、全角の英数字は半角英数字として扱われない点です。[a-zA-Z0-9] はASCIIの半角のみを対象とするため、全角の 012ABCfalse になります。

JavaScript:全角は false になる
isAlphanumeric("012"); // false(全角数字)
isAlphanumeric("ABC"); // false(全角アルファベット)
isAlphanumeric("Abc12"); // false(全角数字が混在)

ユーザーが全角で入力・貼り付けするケースに備えるなら、判定前に全角を半角へ変換してからチェックする方法もあります。変換の仕方は全角を半角に変換する方法にまとめています。

記号やアンダースコアも許可したいとき

ユーザー名などで _(アンダースコア)や -(ハイフン)も許可したい場合は、文字クラスに加えます。ハイフンは文字クラスの末尾に置くと範囲指定と誤解されず安全です。

JavaScript:_ と – も許可する
function isUsername(str) {
  return /^[a-zA-Z0-9_-]+$/.test(str);
}

isUsername("user_name"); // true
isUsername("user-01");   // true
isUsername("user name"); // false(スペースは不可)

用途別:パスワードの文字種要件(先読み)

「英大文字・数字を含み8文字以上」のような複数条件を一度に検証したいときは、先読み(lookahead)を使います。(?=...) は「その条件を満たす箇所が存在するか」だけを確認し、文字を消費しません。

JavaScript:先読みで複数条件
// 英大文字を含む・数字を含む・8文字以上
const rule = /^(?=.*[A-Z])(?=.*[0-9]).{8,}$/;

rule.test("Password1"); // true
rule.test("password1"); // false(大文字なし)
rule.test("PASSWORD");  // false(数字なし)
rule.test("Pw1");       // false(8文字未満)

なお .{8,}. は任意の文字にマッチするため、半角英数字だけに限定したい場合は [A-Za-z0-9]{8,} のように文字クラスで縛ります。

関連:半角全般・全角のチェック

英数字に限らず判定したい場合は、用途に応じて次の記事も参考にしてください。

よくある質問(FAQ)

QJavaScriptで半角英字(アルファベット)のみか確認するには?
A/^[a-zA-Z]+$/.test(str) でチェックできます。大文字のみは [A-Z]、小文字のみは [a-z] に限定します。
Q全角の数字や英字も「半角英数字」として通ってしまいますか?
Aいいえ。[a-zA-Z0-9] はASCIIの半角のみを対象とするため、全角の 012ABCfalse になります。全角入力も受け付けたい場合は、判定前に半角へ変換してからチェックします。
Q空文字を「半角英数字」と判定しないようにするには?
A量指定子を * ではなく + にします。/^[a-zA-Z0-9]+$/ なら、空文字 ""false になります。
Qパスワードの文字種要件をバリデーションするには?
A先読みアサーションを使います。例:/^(?=.*[A-Z])(?=.*[0-9]).{8,}$/ で「大文字含む・数字含む・8文字以上」を一度に確認できます。

まとめ

半角英数字かどうかの判定は /^[a-zA-Z0-9]+$/.test(str) が基本です。* だと空文字も通ってしまうので、1文字以上を要求するなら + を使いましょう。

大切なのは、全角の 012ABC は半角英数字として扱われず false になる点です。全角入力も受け付けたいなら、判定前に半角へ変換します。パスワードのような複数条件は先読み (?=...) でまとめて検証できます。