🔍 電話番号 正規表現ジェネレーター (国別 30 ヶ国)
30 ヶ国以上の電話番号バリデーション用正規表現を即時生成。E.164 / 国際 / 柔軟 / モバイル専用の 4 バリアント、複数国の OR 結合、ライブテスター、JavaScript / PHP / Python / Ruby / Go のコピペ可能スニペット付き。フォーム入力検証・ログ抽出・データクレンジングに。
🔒 プライバシーについて
- ・すべての処理はブラウザ内 (JavaScript) で完結します
- ・入力した電話番号はサーバーに送信されません
📝 生成された正規表現
/^.+$/g
🧪 ライブテスター
💻 言語別コードスニペット
📖 つまずきやすいポイント
30 ヶ国以上について、電話番号のバリデーション用正規表現を生成します。E.164 / 国際 / 柔軟 / モバイル専用の 4 バリアント、複数国の OR 結合、その場で試せるテスター、JavaScript / PHP / Python / Ruby / Go のスニペットが付きます。処理はブラウザ内で完結します。ただし正規表現にできるのは「形が番号らしいか」の判定だけです — その番号が実在するか、今も使われているか、SMS が届くかは分かりません。そして番号計画は変わります: 新しい先頭桁が割り当てられれば、昨日まで正しかった正規表現が、今日から実在の番号を拒否し始めます。
| ケース | 何が起きるか | どうする |
|---|---|---|
| 厳しすぎる正規表現が実在の番号を弾く | 電話番号の体系は各国の規制当局が管理していて、数年おきに変わります — 携帯の新しい先頭 3 桁が追加され、固定電話の市外局番が分割され、新しいサービス用の番号帯が作られます。先頭桁を細かく列挙した正規表現は、その瞬間には正確でも、時間とともに実在の番号を拒否するようになります。しかも番号ポータビリティがあるため、「この先頭桁は携帯だから SMS が届く」という推論はもう成り立ちません — 番号帯とキャリアの対応は固定ではないからです。そして拒否されたユーザーは、理由が分からないまま離脱します — 「あなたの番号は無効です」と表示された正しい番号の持ち主には、打つ手がありません。 | 正規表現は「明らかにおかしい入力を弾く」ためだけに使ってください。 具体的には、桁数の下限と上限、使える文字種、国番号の妥当性程度に留めます — 先頭 3 桁の列挙は、更新し続ける覚悟がないなら書かないほうが安全です。正確さが必要な場面 (SMS 認証・本人確認・課金) では、維持されているライブラリを使ってください — libphonenumber は各国の番号計画を継続的に更新しており、その作業を自分で引き受ける理由はありません。本当に到達するかを確かめる唯一の方法は、実際に送ることです — SMS で確認コードを送るなら、正規表現の精度は最終的な検証にとって重要ではなくなります。 |
| 検証の前に正規化していない | 人は同じ番号を何通りにも書きます — ハイフンあり・なし、空白区切り、括弧付き、国番号あり・なし、先頭のゼロあり・なし、そして全角数字。スマートフォンの連絡先からコピーすると、見えない制御文字や特殊な空白が混ざることもあります。生の文字列をそのまま正規表現に通すと、これらは全部「無効」になります — しかも入力した本人には、何が違うのか見えません (全角と半角の数字は、フォントによっては幅しか違わないのです)。もうひとつ厄介なのが国内表記と国際表記の先頭ゼロです — 多くの国で、国内では先頭に 0 を付け、国番号を付けるときはその 0 を落とします。両方を受け付けたいなら、どちらかに寄せてから比較するしかありません。 |
順序を「正規化 → 検証 → 保存」に固定してください。 正規化では、全角を半角に直し (全角半角変換)、数字と先頭の + 以外をすべて取り除きます — これだけで、上に挙げた表記ゆれのほとんどが吸収されます。検証はその正規化済みの文字列に対して行い、保存は E.164 形式 (+ と国番号から始まる数字だけの形) に統一してください — この形なら、比較も重複判定も国際送信もそのまま通ります。表示するときに、その国の慣習に合わせて整形すればよいのです。入力欄では、ハイフンや空白を許可してください — 「数字だけ入力してください」という制約は、ユーザーに正規化の仕事を押し付けているだけです。 |
| 正規表現エンジンごとに動きが違う | ここのテスターは JavaScript のエンジンで動くので、そこで通ったパターンが、貼り付け先でも同じように動くとは限りません。代表的な違いが 3 つあります。Go の regexp は RE2 なので、先読み ((?=...)) と後方参照が使えません — それらを含むパターンはコンパイル時にエラーになります。PHP の preg_match はデリミタが必要で、/.../ で囲まないと警告が出て何も一致しません。アンカーの意味も揺れます — $ は多くのエンジンで末尾の改行の直前にも一致するので、"09012345678\n<script>" のような入力が通ってしまうことがあります (JavaScript や Python では \z や \Z、あるいは改行を先に除去する対応が必要です)。 |
生成したパターンは、必ず実際に使う言語で 1 度試してください。 とくに Go は「動かない」ではなく「起動時に落ちる」ので、テストがなければ本番で気付きます。テストケースは 3 種類用意してください: 通ってほしい正常な番号、弾いてほしい明らかな誤り、そして境界 (最短・最長・国番号の有無)。「弾いてほしい入力」を必ず入れるのが要点です — 正常系だけを試すと、何でも通す壊れたパターンでもテストが緑になります。そして正規表現をコードに直書きせず、名前を付けて 1 か所にまとめてください — 番号計画が変わったとき、直す場所が 1 つで済みます。 |
どこまで厳しくするかは、その番号を何に使うかで決まります。問い合わせフォームの任意項目なら、厳しい検証は問い合わせを減らすだけです — 連絡が取れなければ困るのは入力した本人であって、あなたが代わりに判定する必要はありません。逆に SMS 認証や配送の連絡先なら、送れないことが即座に業務の失敗になるので、形式の検証ではなく実際の到達確認 (確認コードの送信) を工程に入れてください。この 2 つを同じ厳しさで扱うのが、最も多い設計ミスです。もうひとつ、電話番号は個人情報です — ログに出力しない、エラーメッセージに含めない、分析ツールに URL パラメータとして渡さない。入力途中の値をリアルタイムで検証 API に送る設計は、とくに注意が必要です。そして「無効です」とだけ表示するのは避けてください — 何桁必要なのか、国番号は要るのか、期待する形式を例示すれば、ほとんどの入力ミスはその場で解決します。
📖 使い方
-
1
対象国を選ぶ1 ヶ国だけでも、複数選択して OR 結合 (国際フォームなど) でも構いません。30 ヶ国以上から選択できます。
-
2
バリアントを選ぶE.164 (+ 国コードのみ厳密)・国際形式 (区切り対応)・柔軟 (国際/国内両対応)・モバイル専用の 4 種類から目的に合わせて選択。
-
3
コピー or テスト生成された正規表現はワンクリックでコピー可能。下のライブテスターに番号リストを貼ると、マッチ/未マッチがリアルタイム表示されます。
-
4
好きな言語にコピペJavaScript / PHP / Python / Ruby / Go / Java の即実行可能スニペットも一緒に生成。各言語のエスケープ規則も自動適用。
❓ よくある質問
なぜ libphonenumber を使わないのですか?
国際形式と E.164 はどう違いますか?
複数国を一つの正規表現にできますか?
生成された regex は完璧ですか?
🔗 関連ツール
- ・電話番号フォーマッター — 国際/国内/E.164/tel: URI への変換
- ・正規表現テスター — JavaScript regex のリアルタイムテスト
- ・メール一括検証 — RFC 5322・使い捨て・ロール検出
🐛 このツールで問題が発生しましたか?
完全無料・登録不要。再現手順だけでも結構です。届いたご報告は運営者に直接届き、修正の参考にします。
ご報告ありがとうございます!
運営者に届きました。改善の参考にさせていただきます。