結論

半角英数字とは、半角のアルファベット(A〜Z・a〜z)と半角の数字(0〜9)の合計62文字のことです。入力欄で「半角英数字で入力」と求められたら、この62文字だけを使い、全角の英数字・かな・スペース・記号は入れないのが基本です。

この記事でわかること

  • 半角英数字に含まれる文字・含まれない文字を、Unicode の番号とバイト数で確かめた表
  • 「半角英数字で入力」と言われて通らないときの、症状→原因→直し方の表と、OS別の切り替え方
  • 「半角英数字のみ」を判定する正規表現を Python・JavaScript・Java・PHP・Ruby・Go と Chromium の pattern 属性で比べた結果

2026年10月29日更新|Python 3.13・Node.js 22・Java 21・PHP 8.3・Ruby 3.3・Go 1.24・Chromium 153 で実行確認

この記事で実際に動かしたもの:Python 3.13.18 で25文字の Unicode の番号・幅の種類・UTF-8 と Shift_JIS のバイト列を出し、同じ15通りの入力を6つの言語の正規表現で判定しました。Chromium 153(Playwright 1.63)では、input 要素の pattern 属性での判定結果・エラー文・コンソールの警告、全角を半角に直す処理、文字の表示幅を実際に測りました。

会員登録・ログインID・パスワード・郵便番号などの入力欄でよく見る「半角英数字」は、見た目では全角とほとんど区別できません。最初に、ある1文字が半角英数字かどうかを決める流れを図にします。

flowchart TD
    A[入力された1文字] --> B{U+0020〜007E<br>の範囲か}
    B -- いいえ --> X[対象外<br>全角・かな<br>似た文字]
    B -- はい --> C{英字か数字か}
    C -- はい --> OK[半角英数字<br>62文字]
    C -- いいえ --> S[半角記号<br>スペース<br>33文字]

よく調べられることの答えを先にまとめます。

知りたいこと 答え 詳しい節
半角英数字とは 半角の A〜Z・a〜z・0〜9 の62文字 半角英数字とは(使える62文字)
英数字とは(意味) 英字(アルファベット)と数字をまとめた呼び方。全角・半角は問わない 半角英数字とは(使える62文字)
半角英数字に記号は含まれるか 含まれない。記号も使える欄は「半角英数記号」などと別に書かれる 含まれる文字・含まれない文字
半角と全角の違い 見た目は似ていても別の文字。番号もバイト数も違う 半角と全角の違いをUnicodeで確かめる
半角英数字の入力方法 Windows は「半角/全角」キーか F10、Mac は「英数」キー 半角英数字の入力方法(Windows・Mac・スマホ)
半角英数字で入力したのにエラーになる 前後の空白・全角の混入・コピーで入った見えない文字が多い 半角英数字で入力できないときの症状表
半角英数字の正規表現 ^[A-Za-z0-9]+$。言語によって改行の扱いに注意 「半角英数字のみ」の正規表現
HTML で半角英数字だけにしたい pattern="[A-Za-z0-9]+"。ハイフンを足すときは \- と書く HTMLのpattern属性で半角英数字を求める

確認環境:Ubuntu 24.04.5 LTS(2 CPU・メモリ 8GB の共用マシン)で、Python 3.13.18(re・unicodedata)、Node.js 22.23.4、OpenJDK 21.0.12、PHP 8.3.6(PCRE)、Ruby 3.3.6、Go 1.24.7 を使い、この記事のために作った15通りの入力(全角・空白・改行・記号・見た目の似た文字を含む)を同じ考え方の正規表現で判定しました。ブラウザは Playwright 1.63.0 に付属する Chromium 153.0.8010.12(ヘッドレス)で、pattern 属性の判定・エラー文・コンソールの警告・入力時の正規化・表示幅を測りました。Windows・Mac の入力モードの切り替えは Microsoft サポート「Microsoft 日本語 IME」と Apple サポート「Macで日本語入力ソースに切り替える」「Macで入力した日本語の文字を変更する」、Android は Gboard ヘルプ、pattern 属性の仕様は MDN Web Docs で確かめました。iPhone の画面は手元で操作できず、公式ページの本文も取得できなかったため、手順は載せていません。図は mermaid-cli で描画を確かめました(確認日 2026年10月29日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「半角英数字とは|使える62文字・全角との違い・入力チェック6言語比較」

半角英数字とは(使える62文字)

この節では、半角英数字という言葉が指す文字の範囲と、「英数字」「半角英数記号」など似た言い方との違いが分かります。

半角英数字は「半角の英字」と「半角の数字」をまとめた呼び方で、大文字26・小文字26・数字10の合計62文字です。コンピューターの文字の番号でいうと、ASCII(アスキー)と呼ばれる最も基本的な文字の表のうち、英字と数字の部分にあたります。Unicode でも同じ番号(U+0041〜U+005A、U+0061〜U+007A、U+0030〜U+0039)がそのまま使われています。

大文字(26): ABCDEFGHIJKLMNOPQRSTUVWXYZ
小文字(26): abcdefghijklmnopqrstuvwxyz
数字 (10): 0123456789

Python の string モジュールで数えると、英字と数字を合わせて62、半角の記号は32でした。半角のスペース(U+0020)を加えると、キーボードから直接打てる半角の文字は全部で95文字です。

$ python3 -c "import string; print(len(string.ascii_letters+string.digits), len(string.punctuation))"
62 32

「英数字」という言葉は、ふだんの文章と、入力欄・プログラミングとで指す範囲が少し違います。場面ごとに並べます。

場面 言い方 指す範囲
ふだんの文章 英数字 アルファベットと数字。全角か半角かは気にしない
入力欄の案内 半角英数字 A〜Z・a〜z・0〜9 の62文字。記号・スペースは入らない
入力欄の案内 半角英数記号・半角英数字記号 62文字に加え、半角の記号(!・#・- など)。使える記号はサイトごとに違う
入力欄の案内 半角数字 0〜9 の10文字だけ(電話番号・郵便番号など)
プログラミング 英数字(alphanumeric) 言語や設定によって全角や他の国の文字まで含むことがある(後の節で実測)
正規表現の \w 単語の文字 英数字にアンダースコア(_)を足したもの。言語によっては日本語も含む

大事なのは、「半角英数字」は62文字という決まった範囲を指す一方、プログラムの「英数字」は設定しだいで広がるという点です。入力する側は62文字だけを使えば通り、作る側は「どの62文字を許すか」をはっきり書くと、案内と判定のずれがなくなります。

半角英数字に含まれる文字・含まれない文字(記号・スペース・半角カナ)

この節では、記号・スペース・半角カナ・全角の英数字が半角英数字に入るかどうかが、例で分かります。

半角英数字に入るのは英字と数字だけで、記号・スペース・全角の英数字・かなは入りません。「半角」とつくものがすべて半角英数字というわけではなく、半角カナ(アイウ)も半角英数字ではありません。

○

半角の英字・数字

ABC・abc・123・Taro2026・user01 のように、英字と数字だけを組み合わせたもの。大文字と小文字は別の文字として扱われる。

半角英数字に入る

×

半角の記号・スペース

- _ . @ ! など32種類の記号と、半角スペース。ID に - や _ を使えるかはサイトの案内しだい。

半角だが英数字ではない

×

全角の英字・数字

ABC・123。見た目は似ていても番号が違う別の文字。日本語入力のまま打つとこちらになりやすい。

英数字だが半角ではない

×

かな・漢字・半角カナ

あいう・アイウ・山田・アイウ。半角カナは幅が半分でも英数字ではない。銀行の振込名義などで別に求められる。

英数字ではない

迷いやすい例を表にまとめます。右の列は、この記事の正規表現 ^[A-Za-z0-9]+$(Python の fullmatch)で実際に判定した結果です。

入力例 半角英数字か 理由 判定結果
abc123 はい 小文字と数字だけ 通る
ABC123 はい 大文字と数字だけ 通る
ABC123 いいえ 全角の英字・数字 通らない
abc 123 いいえ 半角スペースが入っている 通らない
abc-123 いいえ ハイフン(記号)が入っている 通らない
abc_123 いいえ アンダースコア(記号)が入っている 通らない
あいう123 いいえ ひらがなが入っている 通らない
(空欄) いいえ 1文字もない。必須かどうかは別の条件 通らない

パスワードの欄では「半角英数字を含む8文字以上」のように、英数字に加えて記号を使ってよい条件になっていることがあります。「半角英数字のみ」と「半角英数字を含む」は意味が違うため、入力欄の案内の言い回しを最後まで読むのが近道です。

半角と全角の違いをUnicodeとバイト数で確かめる

この節では、半角の英数字と全角の英数字がコンピューターの中でどう違うのかが、文字の番号とバイト数の実物で分かります。

半角の「A」と全角の「A」は、見た目が似ているだけの別の文字です。Unicode では A が U+0041、A が U+FF21 で、番号の差はちょうど 0xFEE0 です。全角の英数字と記号は U+FF01〜U+FF5E の「半角・全角形」というまとまりに並んでいます。

Python 3.13 で、文字の番号・幅の種類(Unicode の East Asian Width)・UTF-8 と Shift_JIS(Windows の cp932)でのバイト列を出しました。

番号     幅  UTF-8      Shift_JIS  名前
U+0041   Na  41         41         LATIN CAPITAL LETTER A
U+007A   Na  7a         7a         LATIN SMALL LETTER Z
U+0030   Na  30         30         DIGIT ZERO
U+0020   Na  20         20         SPACE
U+FF21   F   ef bc a1   82 60      FULLWIDTH LATIN CAPITAL LETTER A
U+FF5A   F   ef bd 9a   82 9a      FULLWIDTH LATIN SMALL LETTER Z
U+FF10   F   ef bc 90   82 4f      FULLWIDTH DIGIT ZERO
U+3000   F   e3 80 80   81 40      IDEOGRAPHIC SPACE
U+FF71   H   ef bd b1   b1         HALFWIDTH KATAKANA LETTER A
U+3042   W   e3 81 82   82 a0      HIRAGANA LETTER A

「幅」の列の Na は Narrow(狭い)、F は Fullwidth(全角)、H は Halfwidth(半角)、W は Wide(広い)の略で、Unicode の付属文書 UAX #11 で決められた分類です。半角英数字はすべて Na、全角英数字はすべて F でした。

「半角は1バイト、全角は2バイト」と覚えている人も多いと思います。これは Shift_JIS では正しいのですが、いま主流の UTF-8 ではそうなりません。同じ文字列のバイト数を数えました。

文字列 文字数 UTF-8 のバイト数 Shift_JIS のバイト数
abc123(半角英数字) 6 6 6
ABC123(全角3+半角3) 6 12 9
アイウ(半角カナ) 3 9 3
1バイト半角英数字1文字UTF-8 でも Shift_JIS でも同じ
3バイト全角英数字1文字(UTF-8)Shift_JIS では2バイト
3バイト半角カナ1文字(UTF-8)「半角=1バイト」は UTF-8 では成り立たない

半角英数字だけが、どの文字コードでも1文字1バイトになります。ID やファイル名に半角英数字が求められる理由の1つがここにあり、文字コードの違うシステムの間でやり取りしても化けたり長さが変わったりしません。

自分で確かめる①(ターミナルで1行):Linux・Mac のターミナル、Windows の Git Bash や WSL で、気になる文字列を od に渡すとバイト列が見えます。半角英数字なら1文字が2けたの16進数1つ、全角なら ef bc .. のような3つ組になります。

$ printf 'ABC123' | od -An -tx1
 ef bc a1 ef bc a2 ef bc a3 31 32 33

前の3文字が全角(3バイトずつ)、後ろの 31 32 33 が半角の 1・2・3 です。プログラムの中に全角スペースが混ざって動かない場合の見つけ方は、関連記事「SyntaxError: invalid characterの直し方|全角スペース」で扱っています。この記事は入力欄に入れる文字の範囲を扱い、コードの直し方には立ち入りません。

見た目では分からない「英数字に似た文字」

この節では、半角英数字に見えるのに入力チェックで通らない文字の正体と、開発者ツールでの見つけ方が分かります。

画面では半角英数字に見えても、別の文字が混ざっていると入力チェックは通りません。よくあるのは、Web ページや PDF からコピーしたときに入る見えない空白と、ほかの国の文字です。Python で番号を調べた結果を並べます。

見た目 本当の文字 番号 入りやすい場面
a(英字のa) キリル文字の а U+0430 ロシア語などのキーボード設定、コピー
(見えない) ゼロ幅スペース U+200B Web ページ・チャットからのコピー
(ふつうの空白) ノーブレークスペース U+00A0 HTML の &nbsp; をコピーしたとき
I(大文字のI) ローマ数字のⅠ U+2160 「いち」の変換候補から選んだとき
1 丸数字の① U+2460 変換候補・機種依存文字
-(ハイフン) ‐(U+2010)・−(U+2212)・ー(長音) U+2010 など 電話番号・郵便番号のコピー、かな入力のまま

キリル文字の а で始まる「аbc123」は、画面では abc123 とまったく同じに見えますが、6つの言語のどれで判定しても半角英数字としては通りませんでした。ゼロ幅スペースを間に入れた「abc123」も同じです。この2つは目で見比べても分からないため、番号を出して確かめるのが確実です。

自分で確かめる②(ブラウザの開発者ツールで1行):入力欄で右クリック→「検証」を開くと、その要素が選ばれた状態になります。「コンソール」タブで次の1行を実行すると、入力欄の中身が1文字ずつ番号で表示されます($0 は「要素」タブで選んでいる要素を指します)。開発者ツールは Windows・Linux なら F12、Mac なら Command+Option+I で開けます。

[...$0.value].map(c => c.codePointAt(0).toString(16))

Node.js 22 で同じ処理を「ABC123 」(末尾に半角スペース)に対して実行した結果です。ff21 のように4けたで ff から始まるものが全角、20 が半角スペースです。半角英数字なら、英字は 41〜5a・61〜7a、数字は 30〜39 の範囲に収まります。

[ 'ff21', 'ff22', 'ff23', '31', '32', '33', '20' ]

「半角」は表示幅の名前(Chromiumで測った幅)

この節では、「半角」「全角」という呼び方が何の幅を指しているのかと、実際の画面での幅の違いが、ブラウザで測った数字で分かります。

「半角」「全角」は、もともと等幅の画面で漢字1文字の幅を「全角」、その半分を「半角」と呼んだことから来ています。いまの画面では文字ごとに幅の違うフォントが多く、半角英数字がちょうど全角の半分になるとは限りません。

Chromium 153 で、フォント指定を monospace(等幅)、文字の大きさを 20px にして、同じ文字を10個並べた幅を測りました。英字は DejaVu Sans Mono、全角の文字は WenQuanYi Zen Hei Mono で表示されていました。

10文字の内容 幅(px) 1文字あたり 幅の分類
A を10個(半角英字) 120.4 12.04 Na(狭い)
i を10個(半角英字) 120.4 12.04 Na(狭い)
A を10個(全角英字) 200.0 20.00 F(全角)
ア を10個(半角カナ) 100.0 10.00 H(半角)
あ を10個(ひらがな) 204.7 20.47 W(広い)

全角の A は 20px でちょうど文字の大きさと同じ幅、半角カナは 10px でその半分でした。一方、半角英字は 12.04px で、全角のちょうど半分ではありません。英字と日本語で使われるフォントが違うためです。「半角」は「全角の半分の幅」という目安の名前で、本当の違いは文字の番号にあると考えると、見た目で判断して間違えることがなくなります。

半角英数字の入力方法(Windows・Mac・スマホ)

この節では、日本語入力の状態から半角英数字に切り替える操作と、全角で打ってしまった文字を半角に直す操作が、OSごとに分かります。

日本語を入力できる状態のまま英字を打つと、全角や「かな」になりやすいため、先に入力モードを半角英数に切り替えます。次の表は、Microsoft・Apple・Google の公式ヘルプに書かれている操作だけをまとめたものです。

端末 半角英数に切り替える 打った文字を半角英数字に直す 出典
Windows(Microsoft IME) 「半角/全角」キーで日本語入力のオン/オフ。「英数(Caps Lock)」キーでひらがなモードと英数字モードを切り替え 確定前に F10 で半角英数字、F9 で全角英数字に変換 Microsoft サポート「Microsoft 日本語 IME」
Mac(JIS キーボード) 「英数」キー、または Control+Shift+;(セミコロン) 入力直後に「英数」キーを2回押すと英字に変わる。入力メニューの「英字に変換」も使える Apple サポート「Macで日本語入力ソースに切り替える」「Macで入力した日本語の文字を変更する」
Mac(JIS 以外のキーボード) Control+Shift+'(アポストロフィ) 入力メニューの「英字に変換」 同上
Android(Gboard) スペースキーを長押しして入力言語を切り替える。設定で地球儀の言語切り替えキーも表示できる 英語のキーボードで打ち直す Gboard ヘルプ「別の言語で入力する」
iPhone・iPad キーボードの切り替えは Apple サポート「iPhoneのキーボードを追加する/変更する」に案内がある 英語のキーボードで打ち直す Apple サポート

Windows の F10 と Mac の「英数」2回押しは、ローマ字で打ってしまった文字を確定する前に半角英数字へ直す操作です。たとえば「たろう」と出てしまったときに F10 を押すと、打ったキーのとおり「tarou」になります。確定したあとの文字には効かないため、確定前に押します。

全角の英数字を一度にまとめて半角へ直したい場合(たとえば名簿のデータ)は、手で打ち直すよりプログラムで変換する方が速く確実です。Java・JavaScript・Python・SQL での変換方法は、関連記事「全角⇔半角変換の早見表|Java・JS・Python・Excel・SQL」にまとめています。この記事では、入力欄で求められる範囲と、その判定のしかたを扱います。

半角英数字で入力できない・エラーになるときの症状表

この節では、「半角英数字で入力」と出て先に進めないときに、どこを見ればよいかが症状ごとに分かります。

原因の多くは「全角の混入」「前後の空白」「コピーで入った見えない文字」「使えない記号」の4つです。次の表の上から順に確かめると、たいていはどこかで見つかります。

症状 原因 直し方
半角で打ったつもりなのに「半角英数字で」と出る 日本語入力がオンのまま打ち、全角英数字になっている 入力欄を空にし、半角英数に切り替えて打ち直す
見た目は正しいのに通らない 前後に半角スペース・全角スペースが入っている 欄の最後にカーソルを置いて BackSpace で空白を消す
コピーして貼り付けると通らない、手で打つと通る ゼロ幅スペース・ノーブレークスペース・似た文字が一緒にコピーされた 手で打ち直す。自分で確かめる②の1行で番号を見る
ID にハイフンや下線を入れると通らない その欄は「半角英数字のみ」で、記号を許していない 記号を外す。案内に「記号可」とあるか読み直す
パスワードが合っているはずなのにログインできない Caps Lock がオンで大文字になっている、または全角で登録した Caps Lock を確かめる。パスワードを見える表示にして確かめる
スマホで先頭が勝手に大文字になる キーボードの自動大文字化 大文字と小文字を区別する欄なら、先頭を打ち直す
電話番号・郵便番号のハイフンで通らない 長音「ー」や全角のハイフン、別の種類のダッシュが入った ハイフンを抜いて数字だけで入れる(案内にあれば)
数字の 0 と英字の O、1 と l を取り違える フォントによって形が似ている パスワード表示で確かめる。届いた文字はコピーで使う

どこから見ればよいか迷うときは、次の順番で絞り込みます。

  1. 1入力欄の案内を最後まで読む「のみ」か「を含む」か、記号・文字数の条件を確かめる
  2. 2入力モードを確かめる画面右下(Windows)やメニューバー(Mac)の表示が「A」か「あ」か
  3. 3欄を空にして手で打ち直すコピーで入った見えない文字と前後の空白が一度に消える
  4. 4文字の番号を出すそれでも通らなければ、開発者ツールの1行で ff から始まる文字や 200b を探す

「半角英数字のみ」の正規表現(基本の形)

この節では、入力が半角英数字だけでできているかを判定する正規表現の基本形と、それぞれの記号の意味が分かります。

「半角英数字のみ」の基本形は ^[A-Za-z0-9]+$ です。角かっこ [...] の中に許す文字の範囲を書き、+ で「1文字以上」、^ と $ で「最初から最後まで」を表します。

^          先頭
[A-Za-z0-9] A〜Z・a〜z・0〜9 のどれか1文字
+          直前を1回以上くり返す(空は通さない)
$          末尾

よく使う形をまとめます。文字数の条件は {最小,最大} で書けます。

やりたいこと 正規表現 メモ
半角英数字のみ(1文字以上) ^[A-Za-z0-9]+$ 基本形
半角英数字のみ・8〜16文字 ^[A-Za-z0-9]{8,16}$ ID・パスワードの文字数の条件
半角数字のみ ^[0-9]+$ \d は言語によって全角数字も通す(次の節)
半角英字のみ ^[A-Za-z]+$ 大文字だけなら [A-Z]
英字と数字を両方1文字以上含む ^(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]+$ 先読みで「含む」を確かめる
半角英数字と - _ を許す ^[A-Za-z0-9_\-]+$ ハイフンは \- と書くと、HTML の pattern でも使える

\w や \d を使うと短く書けますが、言語によって範囲が違います。\w はアンダースコアも通し、言語や設定によっては日本語まで通します。「半角英数字のみ」は、角かっこの中に範囲をそのまま書く形がいちばん確実です。正規表現の記号全体の意味は関連記事「正規表現 早見表|記号一覧・言語別の違い・実用パターン(実行結果つき)」で扱っています。

半角英数字の正規表現を6言語で比べた結果

この節では、同じ「半角英数字のみ」の正規表現でも、言語によって通ってしまう入力があることが、実行結果で分かります。

6つの言語で同じ15通りの入力を判定したところ、「abc123」「ABC123」はどれでも通り、全角・空白・記号・似た文字はどれでも止まりました。違いが出たのは「改行」と「\d・\w の範囲」です。

次の表は、^[A-Za-z0-9]+$ をそれぞれの言語のふつうの書き方で使ったときの結果です。「abc123\n」は末尾に改行が1つ付いた入力、「abc\nxyz」は途中に改行がある入力です。

言語(書き方) abc123\n abc\nxyz [a-zA-Z\d] に abc123 改行で通さない書き方
Python(re.search) 通る 通らない 通る re.fullmatch または \A と \Z
JavaScript(test) 通らない 通らない(m フラグで通る) 通らない m フラグを付けない
Java(matches) 通らない(find では通る) 通らない 通らない matches を使う
PHP(preg_match) 通る 通らない 通る(u 修飾子のとき) D 修飾子、または \A と \z
Ruby(match?) 通る 通る 通らない \A と \z
Go(MatchString) 通らない 通らない((?m) で通る) 通らない (?m) を付けない

いちばん気をつけたいのは Ruby です。Ruby の ^ と $ は「行の先頭・行の末尾」を意味するため、2行目に何が書かれていても、1行目が半角英数字なら通ってしまいます。Python と PHP の $ は「末尾、または末尾の改行の直前」に一致するため、最後に改行が1つ付いた入力が通ります。

実行した Ruby のコードと、その出力の一部です。

require 'json'
JSON.parse(File.read(ARGV[0])).each { |s|
  r = [/^[A-Za-z0-9]+$/, /^\w+$/, /^[a-zA-Z\d]+$/, /\A[A-Za-z0-9]+\z/, /\A[[:alnum:]]+\z/]
        .map { |p| p.match?(s) ? 'o' : '-' }
  puts s.to_json.ljust(22) + ' ' + r.join(' ')
}
"abc123"               o o o o o
"ABC123"         - - - - o
"abc123\n"             o o o - -
"abc\nxyz"             o o o - -
"abc_123"              - o - - -
"あいう123"            - - - - o

4列目の \A...\z は改行の入った入力をすべて止めています。5列目の [[:alnum:]](POSIX の英数字クラス)は、Ruby では全角の英数字やひらがなまで通しました。名前に「英数字(alnum)」と付いていても、半角英数字の判定には使えないことが分かります。

もう1つの違いは \d と \w の範囲です。\d を全角の数字にも一致させた言語と、半角の0〜9だけにした言語に分かれました。

\d が全角数字も通した

Python 3.13(str の正規表現は Unicode が既定)

PHP 8.3(u 修飾子を付けたとき)

Python の \w は ひらがな・キリル文字・ローマ数字Ⅰ も通した

\d は半角0〜9だけだった

JavaScript(u フラグを付けても同じ)

Java(UNICODE_CHARACTER_CLASS を付けなければ)

Ruby・Go

Python で \d を半角だけにしたいときは re.ASCII フラグを付けます。実際、re.search(r'^\w+$', s, re.ASCII) にすると、全角・ひらがな・キリル文字はすべて止まりました(アンダースコアと末尾の改行は通ります)。\d と全角の落とし穴そのものは、関連記事「正規表現の落とし穴8選|ReDoS・\dと全角・先読み・gフラグ」でも取り上げています。

6言語それぞれで、改行も全角も通さない書き方をまとめます。

# Python
import re
re.fullmatch(r'[A-Za-z0-9]+', s) is not None
// JavaScript
/^[A-Za-z0-9]+$/.test(s)
// Java(matches は全体一致)
s.matches("[A-Za-z0-9]+")
// PHP(\A と \z、または末尾に D 修飾子)
preg_match('/\A[A-Za-z0-9]+\z/', $s) === 1
# Ruby(^ と $ は使わない)
/\A[A-Za-z0-9]+\z/.match?(s)
// Go(RE2。$ は末尾の改行を通さない)
regexp.MustCompile(`^[A-Za-z0-9]+$`).MatchString(s)

PHP で /^[A-Za-z0-9]+$/ と /\A[A-Za-z0-9]+\z/ に「abc123\n」を渡すと、前者は int(1)(一致)、後者は int(0)(不一致)が返りました。メールアドレスのように範囲がもっと複雑な入力の判定は、関連記事「メールアドレスの正規表現|実用パターンとチェックの注意点」で扱っています。

HTMLのpattern属性で半角英数字を求める(Chromiumの実測)

この節では、HTML の input 要素に pattern 属性を書いて半角英数字だけを受け付ける方法と、書き方を1文字誤ると判定が丸ごと効かなくなる例が分かります。

HTML では <input pattern="[A-Za-z0-9]+"> と書くと、半角英数字以外が入ったときに送信前のチェックで止まります。pattern 属性は値の全体に一致させる決まりで、MDN は「始めに ^(?: が、終わりに )$ が含まれているかのように扱われる」と説明しています。そのため ^ と $ は書かなくても全体一致になります。

<label for="uid">ユーザーID(半角英数字 4〜16文字)</label>
<input id="uid" name="uid" required
       pattern="[A-Za-z0-9]{4,16}"
       autocomplete="username">

Chromium 153 で、4種類の pattern を書いた入力欄に同じ値を入れ、validity.valid を読み出しました。

入れた値 [A-Za-z0-9]+ [A-Za-z0-9-]+ [A-Za-z0-9\-]+ \w+
abc123 通る 通る 通る 通る
ABC123 止まる 通る 止まる 止まる
abc 123 止まる 通る 止まる 止まる
abc-123 止まる 通る 通る 止まる
abc_123 止まる 通る 止まる 通る
あいう123 止まる 通る 止まる 止まる

2列目の [A-Za-z0-9-]+ だけ、何を入れても通っています。コンソールには次の警告が出ていました。

Pattern attribute value [A-Za-z0-9-]+ is not a valid regular expression: Uncaught SyntaxError: Failed to read the 'valid' property from 'ValidityState': Invalid regular expression: /[A-Za-z0-9-]+/v: Invalid character class

pattern 属性はいま v フラグ付きの正規表現として読まれます。v フラグでは、角かっこの中のハイフンを \- とエスケープする決まりがあり、[A-Za-z0-9-] は文法の誤りになります。MDN には「属性値が存在しないか、空文字列か、不正な場合は、正規表現は適用されません」とあり、判定が止まるのではなく、チェックそのものが行われなくなります。JavaScript の /[A-Za-z0-9-]+/u(u フラグ)では同じ書き方が通るため、JavaScript から写したときに起こりやすい誤りです。

pattern 属性で記号を足すとき

やってはいけないpattern="[A-Za-z0-9-_]+" のように、ハイフンを角かっこの中にそのまま書く。コンソールに警告が出るだけで、チェックが丸ごと無効になる
→
代わりにpattern="[A-Za-z0-9_\-]+" と \- で書き、全角や空白を入れて止まることを開発者ツールで確かめる

v フラグでエスケープが要る記号は ( ) [ ] { } / - | です

もう1つ、type="text" の入力欄に改行を含む値を入れると、ブラウザが改行を取り除いて「abcxyz」にしてから判定しました。入力欄の見た目の上では改行は入りませんが、受け取る側に改行が届かないとは限りません。HTML のチェックは画面の案内であり、送られてきた値は受け取る側でも同じ条件で確かめます。

エラーの表示は、このヘッドレスの Chromium では英語の「Please match the requested format.」「Please fill out this field.」でした。表示される文言はブラウザと言語設定で変わるため、入力欄の近くに「半角英数字 4〜16文字」と条件を書いておくと、エラーが出る前に伝わります。required・minlength・setCustomValidity を使った完成形のフォームは、関連記事「HTMLフォームバリデーション|required・pattern早見表と完成例」で扱っています。

全角で入力されたら半角に直す(受け取る側の作法とどの文字が悪いかの伝え方)

この節では、入力欄を作る側が、全角で打たれた英数字をエラーにせず半角に直す方法と、通らなかったときに「どの文字が原因か」を伝える方法が分かります。

全角の「ABC123」は、Unicode の NFKC 正規化をかけると「ABC123」になります。入力のたびにエラーを出すより、明らかに同じ意味の全角英数字は半角に直してから判定する方が、入力する人の手間が減ります。

Chromium 153 で、入力欄に次の処理を付け、日本語入力の確定と同じ「文字の挿入」で値を入れました。日本語入力の変換中(isComposing が true の間)は書き換えず、確定したときに直します。

const el = document.getElementById('id');
function toHankaku(s) {
  return s.normalize('NFKC').replace(/[\s\u200b]/g, '');
}
el.addEventListener('compositionend', () => { el.value = toHankaku(el.value); });
el.addEventListener('input', (e) => {
  if (!e.isComposing) el.value = toHankaku(el.value);
});
"ABC123"        -> "ABC123"     valid
"abc 123"            -> "abc123"     valid
"user\u200b01"  -> "user01"     valid
"taro2026 "   -> "taro2026"   valid
"①②③"                -> "123"        valid
"アイウ"                 -> "アイウ"     patternMismatch

全角英数字・全角スペース・ゼロ幅スペースは直り、判定も通りました。一方で、丸数字の「①②③」も「123」になっています。NFKC は「意味が近い文字」をまとめて変えるため、変えてよい範囲を決めてから使います。半角カナは全角カナに変わり、英数字ではないので正しく止まりました。

1

許す文字を案内に書く

「半角英数字 4〜16文字(記号不可)」のように、範囲と文字数を入力欄の近くに書く。title 属性だけに頼らない。

案内

2

全角英数字と空白は直す

NFKC 正規化と前後の空白の除去をかける。丸数字などが変わってよいかは、欄の用途で決める。

正規化

3

直したあとの値で判定する

画面では pattern、受け取る側では全体一致の正規表現で、同じ範囲を確かめる。

判定

4

通らなければ原因の文字を示す

「4文字目に全角の文字があります」のように、場所と種類を伝える。

伝える

受け取る側でも同じ考え方で直せます。Java は java.text.Normalizer、PHP は mb_convert_kana を使います。実行した結果です。

$ java N          # Normalizer.normalize("ABC123", Form.NFKC)
ABC123 true false   # 直した値は通り、元の値は通らない

$ php -r 'var_dump(mb_convert_kana("ABC123 x","as"));'
string(8) "ABC123 x"   # a: 全角英数字→半角、s: 全角スペース→半角

通らなかったときに「半角英数字で入力」とだけ返すと、見えない文字が原因の場合、入力する人は何を直せばよいか分かりません。そこで、最初に見つかった「62文字以外の文字」の場所と番号を返す関数を Python で書きました。

import unicodedata as u
OK = set('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')

def why(s):
    for i, c in enumerate(s):
        if c in OK:
            continue
        w = u.east_asian_width(c)
        if w in ('F', 'W'):
            hint = '全角'
        elif c.isspace() or c == '\u200b':
            hint = '空白・改行'
        elif c.isascii():
            hint = '半角の記号'
        else:
            hint = '英数字に似た別の文字'
        return f'{i+1}文字目 U+{ord(c):04X} {u.name(c, "制御文字")}({hint})'
    return 'OK' if s else '空'
"abc123"       OK
"abc123"    4文字目 U+FF11 FULLWIDTH DIGIT ONE(全角)
"abc123 "      7文字目 U+0020 SPACE(空白・改行)
"abc-123"      4文字目 U+002D HYPHEN-MINUS(半角の記号)
"аbc123"       1文字目 U+0430 CYRILLIC SMALL LETTER A(英数字に似た別の文字)
"abc\u200b123" 4文字目 U+200B ZERO WIDTH SPACE(空白・改行)
""             空

画面にはこの結果をそのまま出さず、「4文字目に全角の数字があります」「7文字目に空白があります」のように言い換えて表示すると伝わりやすくなります。

  • 1案内の文言と判定の範囲が同じか「半角英数字」と書いたのに _ や - を通していないか
  • 2全体一致になっているかRuby・PHP・Python は \A と \z、fullmatch で末尾の改行も止める
  • 3\d・\w を使っていないか[0-9]・[A-Za-z0-9] と範囲を書く
  • 4pattern 属性に警告が出ていないか開発者ツールのコンソールを開いてページを読み込み直す
  • 5受け取る側でも同じ判定をしているか画面のチェックは外せるため、送られた値を確かめる

よくあるエラー/つまずき(原文つき)

この節では、半角英数字の判定を書くときに実際に出たエラーの原文と、意味・直し方が分かります。

角かっこを閉じ忘れた [A-Za-z0-9 を各言語でコンパイルしたときのエラーと、判定の誤りにつながった実例を並べます。

どこで 原文 意味と直し方
Python re.error: unterminated character set at position 0 角かっこが閉じていない。] を足す
Java PatternSyntaxException: Unclosed character class near index 9 同じ。^ の位置が問題の場所
PHP preg_match(): Compilation failed: missing terminating ] for character class at offset 10 同じ。preg_match は false を返し、preg_last_error_msg() は「Internal error」
Ruby RegexpError: premature end of char-class: /[A-Za-z0-9/ 同じ
Go error parsing regexp: missing closing ]: `[A-Za-z0-9` 同じ。MustCompile なら起動時に止まる
JavaScript(v フラグ) SyntaxError: Invalid regular expression: /[A-Za-z0-9-]+/v: Invalid character class v フラグではハイフンを \- と書く
Chromium のフォーム Please match the requested format. pattern に合わない値。全角・空白・記号が入っている
Ruby・PHP・Python (エラーは出ない)「abc123\n」が通る $ が末尾の改行の前でも一致する。\A と \z にする

いちばん見落としやすいのは、最後の行のようにエラーが出ずに、通すべきでない値が通ってしまう場合です。この記事の15通りのように、全角・空白・改行・似た文字を含むテスト用の入力を一度作っておき、正規表現を書き換えるたびに流すと、言語を移したときの違いにも気づけます。

判断表:半角英数字の条件をどう決めるか

この節では、入力欄の種類ごとに、半角英数字に限るべきか、どこまで許すかを決める目安が分かります。

入力欄 おすすめの条件 理由
ユーザーID・会員番号 半角英数字のみ(必要なら _ -)・文字数を決める URL やファイル名に使われることがあり、文字コードで化けない
パスワード 半角英数字に記号も許す。長さを重視 使える文字を狭めると、組み合わせが減る
郵便番号・電話番号 半角数字のみ。全角とハイフンは受け取る側で直す 入力する人は全角やハイフンで打ちやすい
メールアドレス 半角英数字だけにはしない(. _ + - @ などが入る) 英数字以外の記号が正当に使われる
氏名・住所 半角英数字に限らない 日本語が入るのが当たり前の欄
クーポン・認証コード 半角英数字。全角は直し、大文字小文字の区別は案内に書く コピーや手打ちで全角・空白が入りやすい
プログラムの識別子(変数名など) 半角英数字と _。先頭は英字 多くの言語の決まりに合わせる

1範囲は言葉と正規表現の両方で書く

「半角英数字」と書くなら判定は [A-Za-z0-9]。記号を許すなら、案内にも使える記号を並べる。

2直せるものは直してから判定する

全角英数字・前後の空白は NFKC と除去で直す。エラーにするのは本当に使えない文字だけにする。

3画面と受け取る側で同じ条件にする

HTML の pattern と受け取る側の正規表現が同じ範囲かを、テスト用の入力で確かめる。

よくある質問

この節では、半角英数字について検索でよく聞かれる疑問の答えが分かります。

Q. 半角英数字とは何文字ですか?
大文字26・小文字26・数字10の合計62文字です。記号32文字と半角スペースを合わせると、半角で打てる文字は95文字になります。

Q. 英数字とはどういう意味ですか?
英字(アルファベット)と数字をまとめた呼び方です。ふだんは全角か半角かを区別せずに使いますが、入力欄で「半角英数字」とあれば半角の62文字を指します。

Q. 半角英数字に記号は含まれますか?
含まれません。記号も使える欄は「半角英数記号」「半角英数字・記号」などと書かれます。どの記号が使えるかはサイトごとに違うため、案内を確かめます。

Q. 半角英数字に大文字は含まれますか?
含まれます。A〜Z の大文字も a〜z の小文字も半角英数字です。ただし大文字と小文字は別の文字として扱われるため、パスワードなどでは区別されます。

Q. 半角英数字と半角数字の違いは何ですか?
半角数字は 0〜9 の10文字だけ、半角英数字はそれに英字52文字を加えた62文字です。電話番号の欄で英字を入れると通らないのはこのためです。

Q. 半角カナは半角英数字ですか?
いいえ。アイウ は幅が半分の文字ですが、英字でも数字でもありません。UTF-8 では1文字3バイトになり、「半角=1バイト」も成り立ちません。

Q. 半角英数字で入力しているのにエラーになるのはなぜですか?
前後の空白、コピーで入ったゼロ幅スペース、見た目の似た別の文字が多い原因です。欄を空にして手で打ち直すと、たいてい通ります。それでも通らなければ、開発者ツールの1行で文字の番号を確かめます。

Q. Windows で半角英数字に切り替えるには?
「半角/全角」キーで日本語入力をオフにするか、ローマ字で打ったあと確定前に F10 を押します(Microsoft サポート「Microsoft 日本語 IME」)。

Q. Mac で半角英数字に切り替えるには?
JIS キーボードなら「英数」キー、または Control+Shift+; を押します。打ったあとなら、確定前に「英数」キーを2回押すと英字に変わります(Apple サポート)。

Q. 「半角英数字のみ」の正規表現は?
^[A-Za-z0-9]+$ です。Ruby・PHP・Python では末尾の改行が通るため、\A[A-Za-z0-9]+\z や re.fullmatch を使います。\d・\w は言語によって全角も通すので使いません。

Q. HTML の pattern 属性でハイフンも許したいときは?
pattern="[A-Za-z0-9\-]+" と \- で書きます。[A-Za-z0-9-]+ と書くと v フラグの文法の誤りになり、Chromium 153 ではチェックそのものが効かなくなりました。

まとめ

この節では、記事の要点を5つにまとめて振り返れます。

  • 半角英数字とは、半角の A〜Z・a〜z・0〜9 の62文字です。記号・スペース・全角の英数字・かな・半角カナは入りません。
  • 半角の「A」(U+0041)と全角の「A」(U+FF21)は別の文字です。半角英数字だけが UTF-8 でも Shift_JIS でも1文字1バイトで、半角カナは UTF-8 では3バイトでした。
  • 通らないときは、入力モード、前後の空白、コピーで入った見えない文字、使えない記号の順に確かめます。開発者ツールの1行とターミナルの1行で、文字の番号を自分で確かめられます。
  • 判定は [A-Za-z0-9] と範囲を書き、全体一致にします。Ruby の ^ $、Python・PHP の $ は改行を通し、Python・PHP(u)の \d は全角数字を通しました。
  • HTML の pattern 属性ではハイフンを \- と書きます。全角英数字は NFKC で直してから判定し、通らなければ原因の文字の場所を伝えると親切です。

参考・出典

この節では、この記事で確かめた公式の資料が分かります(確認日 2026年10月29日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「半角英数字とは|使える62文字・全角との違い・入力チェック6言語比較」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

成長のヒミツ、 ぜんぶ丸わかり