- pattern は「この入力欄の“合格パターン”を正規表現で決めるためのルール」
- pattern の基本:中身は「正規表現」というルールの言語
- よく使う正規表現の“部品”を感覚で覚える
- 具体例1:日本の郵便番号(123-4567)を pattern でチェックする
- 具体例2:ユーザーIDを「英数字+アンダースコア」に限定する
- ブラウザのエラーメッセージと pattern:何が起きるか
- JavaScript と pattern:自前バリデーションと組み合わせる
- pattern の限界と注意点:「複雑すぎる正規表現はやめておこう」
- pattern を使うか迷ったときの判断基準
- 初心者として「pattern」で絶対に掴んでほしいこと
pattern は「この入力欄の“合格パターン”を正規表現で決めるためのルール」
pattern は、 「この入力欄には、こういう形の文字列だけを“正解”として受け付けてほしい」 とブラウザに伝えるための属性です。
required が「空かどうか」しか見ないのに対して、 pattern は「中身の形(パターン)」までチェックします。
郵便番号(123-4567) ユーザーID(英数字だけ) 商品コード(ABC-123 みたいな形式)
こういう「形が決まっている文字列」を入力してもらうときに、 pattern を使うと、 ブラウザが自動で“合格か不合格か”を判定してくれます。
pattern の基本:中身は「正規表現」というルールの言語
まずは「英数字だけOK」の例から
<input
type="text"
name="user_id"
pattern="[A-Za-z0-9]+"
required
placeholder="英数字のみ"
>
ここでの pattern="[A-Za-z0-9]+" は、
[A-Za-z0-9]→ 英大文字・英小文字・数字のどれか 1 文字+→ それが 1 文字以上続く
という意味です。
つまり、
abc→ OKUser123→ OK12345→ OKabc_123→ NG(_が入っている)
という判定になります。
pattern の中身は「正規表現(Regular Expression)」という“文字列の形を表現するためのミニ言語”。 最初は難しく見えるけど、よく使うパターンだけ覚えれば十分戦えます。
よく使う正規表現の“部品”を感覚で覚える
「数字だけ」のパターン
<input
type="text"
name="age"
pattern="[0-9]+"
required
placeholder="半角数字のみ"
>
[0-9]+ は「0〜9 の数字が 1 文字以上」という意味。
20→ OK003→ OKabc→ NG
「英字だけ」のパターン
pattern="[A-Za-z]+"
abc→ OKXYZ→ OKabc123→ NG
「英数字だけ」のパターン(さっきのやつ)
pattern="[A-Za-z0-9]+"
「先頭から末尾まで、全部このルールで」という書き方
本来の正規表現では、 ^ が「文字列の先頭」、$ が「末尾」を表します。
でも、HTML の pattern は 「暗黙的に先頭から末尾までマッチするかどうか」を見てくれるので、 基本的には ^ と $ を書かなくても大丈夫です。
具体例1:日本の郵便番号(123-4567)を pattern でチェックする
HTMLでの書き方
<label for="zip">郵便番号</label>
<input
type="text"
id="zip"
name="zip"
pattern="[0-9]{3}-[0-9]{4}"
required
placeholder="例)123-4567"
>
ここでの pattern="[0-9]{3}-[0-9]{4}" は、
[0-9]{3}→ 数字が 3 文字-→ ハイフン[0-9]{4}→ 数字が 4 文字
という意味です。
判定はこうなります。
123-4567→ OK12-34567→ NG(前半が 2 桁)1234567→ NG(ハイフンがない)abc-defg→ NG
「郵便番号は必ず 3桁-4桁 の形で書いてほしい」というルールを、 pattern でブラウザに伝えているわけです。
具体例2:ユーザーIDを「英数字+アンダースコア」に限定する
HTMLでの書き方
<label for="user_id">ユーザーID</label>
<input
type="text"
id="user_id"
name="user_id"
pattern="[A-Za-z0-9_]+"
required
placeholder="英数字とアンダースコアのみ"
>
[A-Za-z0-9_]+ は、
- 英字(大文字・小文字)
- 数字
_
のどれかが 1 文字以上、という意味です。
判定はこう。
mono_123→ OKMONO→ OKuser-name→ NG(-が入っている)user.name→ NG(.が入っている)
「使っていい文字の種類」を pattern で決めることで、 後で扱いやすい ID だけを受け付けられる。
ブラウザのエラーメッセージと pattern:何が起きるか
pattern に合わない文字列で送信しようとすると…
例えば、さっきの郵便番号入力欄で 1234567 と打って送信すると、 ブラウザがこう判断します。
- required → OK(空ではない)
- pattern → NG(
3桁-4桁の形ではない)
その結果、
- フォーム送信がブロックされる
- 「入力内容が正しくありません」的なメッセージが出る(ブラウザによって文言は違う)
という挙動になります。
pattern は「HTML標準のバリデーション」に組み込まれている。 自分で JavaScriptを書かなくても、 “形が違う入力”をブラウザが止めてくれる。
JavaScript と pattern:自前バリデーションと組み合わせる
checkValidity() と validationMessage を使う
HTML:
<form id="zipForm">
<label for="zip">郵便番号</label>
<input
type="text"
id="zip"
name="zip"
pattern="[0-9]{3}-[0-9]{4}"
required
placeholder="例)123-4567"
>
<button type="submit">送信</button>
</form>
<p id="message"></p>
JavaScript:
const form = document.querySelector("#zipForm");
const zipInput = document.querySelector("#zip");
const message = document.querySelector("#message");
form.addEventListener("submit", (event) => {
if (!zipInput.checkValidity()) {
event.preventDefault(); // 送信を止める
message.textContent = zipInput.validationMessage;
} else {
message.textContent = "送信OKです。";
}
});
JavaScriptここでのポイントは、
zipInput.checkValidity()が required や pattern をまとめてチェックしてくれる- NG のときは
validationMessageにブラウザ標準のエラーメッセージが入る
ということです。
pattern を HTML側に書いておけば、 JavaScript側では「そのルールに合っているかどうか」を checkValidity() で一発確認できる。 自分で正規表現を書く必要がなくなる。
pattern の限界と注意点:「複雑すぎる正規表現はやめておこう」
メールアドレスを pattern で完全にチェックしようとしない
よくある罠がこれです。
<input
type="email"
name="email"
pattern="なんかすごく長い正規表現"
>
メールアドレスの完全な正規表現は、 仕様が複雑すぎて、 現実的にはほぼメンテ不能です。
メールアドレスなら、 type="email" に任せる方がずっと楽です。
<input
type="email"
name="email"
required
>
pattern は「自分でルールを決めたいとき」に使うもの。 すでに type="email" や type="url" が持っている標準ルールを わざわざ pattern で再実装する必要はない。
pattern を使うか迷ったときの判断基準
「この入力欄には“形が決まっている文字列”を書いてほしいか?」
自分にこう聞いてみてください。
この入力欄は、
- ただの自由なテキストか?
- それとも「こういう形じゃないと困る」ものか?
自由なテキスト → pattern は不要 形が決まっている → pattern を検討する
例えば、
- 郵便番号 →
3桁-4桁の形が決まっている - ユーザーID → 英数字だけにしたい
- 商品コード →
ABC-123のような形式にしたい
こういう欄には、 pattern がかなり効いてきます。
初心者として「pattern」で絶対に掴んでほしいこと
pattern は、 「この入力欄の“合格パターン”を正規表現で決めて、ブラウザにそのルールを守らせるための属性」 です。
- 中身は正規表現(文字列の形を表現するミニ言語)
- 「数字だけ」「英数字だけ」「
3桁-4桁」などを簡単に書ける - required が「空かどうか」、pattern が「形が合っているかどうか」を見る
checkValidity()と組み合わせると、JS側でも簡単に「合格/不合格」を判定できる- 複雑すぎる正規表現は避けて、「形が決まっているもの」にだけ使う
あなたが pattern を書くときに、 「この入力欄には“こういう形の文字列だけ”を通したくて、 そのルールをブラウザに正規表現で教えているんだよな」 とイメージできていたら、 もう pattern を“ただの難しそうな属性”ではなく、 “ユーザーの入力とあなたのロジックをきれいに揃えてくれる、頼れるフィルター”として扱えている状態です。
