【JavaScript】正規表現testメソッドを使った入力値の形式チェック

目次

概要

ユーザーの入力値が期待する形式(電話番号、郵便番号、メールアドレスなど)に沿っているかを判定するには、正規表現オブジェクトの test() メソッドを使用するのが最も効率的です。

本記事では、単純な文字列検索から複雑なフォーマット検証まで、test() メソッドを用いてリアルタイムに入力値をバリデーション(検証)する実装方法を解説します。

仕様(入出力)

  • 入力: 電話番号入力フィールドへのテキスト入力(ハイフン入りの入力を許容)。
  • 出力: 形式が正しくない場合に表示される警告メッセージ。
  • 動作:
    1. 入力された文字列からハイフン(-)を取り除く。
    2. 整形後の文字列が「0から始まる10桁または11桁の数字」であるかを判定する。
    3. 条件を満たさない場合、警告メッセージを表示する。

基本の使い方

正規表現リテラル(/パターン/)に対して test() メソッドを実行します。一致すれば true、しなければ false を返します。

メソッド意味戻り値
正規表現.test(文字列)文字列がパターンにマッチするか判定するtrue / false
// 'J' が含まれているか
console.log(/J/.test('JavaScript')); // true

// 先頭が 'iP' で始まるか (^ は先頭)
console.log(/^iP/.test('iPhone')); // true

// 数字が含まれているか (\d は数字)
console.log(/\d/.test('suzuki')); // false

// 'Java' の後に何かが続くか (.* は任意の文字の繰り返し)
console.log(/Java.*/.test('JavaScript')); // true

コード全文(HTML / JavaScript)

HTML

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Regex Validation Example</title>
    <style>
        body { font-family: sans-serif; padding: 20px; }
        .form-group { margin-bottom: 15px; }
        label { display: block; margin-bottom: 5px; font-weight: bold; }
        input[type="tel"] {
            padding: 10px;
            width: 100%;
            max-width: 300px;
            font-size: 16px;
            border: 1px solid #ccc;
            border-radius: 4px;
        }
        /* エラー時のスタイル */
        .input-error { border-color: #d32f2f; background-color: #ffebee; }
        
        .error-message {
            color: #d32f2f;
            font-size: 0.9em;
            margin-top: 5px;
            display: none; /* 初期状態は非表示 */
            font-weight: bold;
        }
        .error-message.visible { display: block; }
    </style>
</head>
<body>

    <div class="form-group">
        <label for="telInput">電話番号 (ハイフンなし、またはハイフンあり)</label>
        <input type="tel" id="telInput" placeholder="例: 090-1234-5678">
        <div id="errorMsg" class="error-message">
            ※ 電話番号は0から始まる10桁または11桁の半角数字で入力してください。
        </div>
    </div>

    <script src="app.js"></script>
</body>
</html>

JavaScript

/**
 * HTML要素の参照を取得
 */
const telInput = document.querySelector('#telInput');
const errorMsg = document.querySelector('#errorMsg');

/**
 * 電話番号の形式を検証する関数
 */
const validatePhoneNumber = () => {
    // 1. 入力値を取得
    const rawValue = telInput.value;

    // 入力が空の場合はエラーを消して処理終了
    if (rawValue === '') {
        errorMsg.classList.remove('visible');
        telInput.classList.remove('input-error');
        return;
    }

    // 2. ハイフンを削除して正規化(数値のみにする)
    const trimmedValue = rawValue.replace(/-/g, '');

    // 3. 正規表現による判定
    // ^ : 文字列の先頭
    // 0 : 最初の文字は0
    // [0-9]{9,10} : 0-9の数字が9個~10個続く (合計10~11桁)
    // $ : 文字列の末尾
    const pattern = /^0[0-9]{9,10}$/;
    
    // test() メソッドでマッチするか確認
    const isValid = pattern.test(trimmedValue);

    // 4. 結果に応じたUI更新
    if (isValid) {
        // 正しい形式
        errorMsg.classList.remove('visible');
        telInput.classList.remove('input-error');
    } else {
        // 不正な形式
        errorMsg.classList.add('visible');
        telInput.classList.add('input-error');
    }
};

// キー入力のたびに検証を実行 (keyup)
telInput.addEventListener('keyup', validatePhoneNumber);

カスタムポイント

  • 正規表現パターンの変更:検証したい対象に合わせて正規表現を差し替えてください。
    • 郵便番号 (例: 123-4567): /^\d{3}-\d{4}$/
    • 半角英数字のみ: /^[a-zA-Z0-9]+$/
    • カタカナのみ: /^[\u30A0-\u30FF]+$/
  • エラー表示のタイミング:現在は keyup(文字入力直後)で判定していますが、blur(フォーカスが外れた時)に変更することで、入力中は警告を出さず、書き終わったタイミングでチェックする挙動に変更できます。

注意点

  1. test()メソッドのステートフル性:正規表現に g (global) フラグを付けた場合、test() は前回マッチした位置を記憶してしまいます。単純なチェックには g フラグを付けないか、毎回正規表現オブジェクトを生成するようにしてください。
  2. 完全一致の重要性:^ (先頭) と $ (末尾) を付け忘れると、部分一致(”abc09012345678xyz” など)でも true になってしまいます。入力値全体の形式を問う場合は必ず両端を指定してください。
  3. セキュリティ:クライアントサイド(JavaScript)でのバリデーションはあくまでユーザー体験の向上が目的です。サーバー送信時には、必ずサーバー側でも再度検証を行ってください。

応用

複数の条件を組み合わせたパスワード強度チェック

「英字」と「数字」の両方を含んでいるかを判定する例です。

const password = "password123";

// 英字が含まれるか
const hasLetter = /[a-zA-Z]/.test(password);
// 数字が含まれるか
const hasDigit = /[0-9]/.test(password);
// 8文字以上か
const hasLength = password.length >= 8;

if (hasLetter && hasDigit && hasLength) {
    console.log("強力なパスワードです");
} else {
    console.log("英字と数字を含む8文字以上にしてください");
}

まとめ

正規表現.test() は、入力値が特定のパターンに合致しているかを真偽値で即座に判定できるメソッドです。includes() などの文字列メソッドでは判定できない「数字の繰り返し」や「先頭・末尾の指定」といった複雑なルールを、簡潔なコードで実装できます。ユーザーフォームの品質向上には欠かせない技術です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次