Javaで文字列が半角英数字であるかを正規表現でチェックする

半角英数字を正規表現でチェックするには^[a-zA-Z0-9]+$を使用します。この正規表現は「1文字以上の半角英数字で構成される文字列」という意味を持ち、3DModel などの文字列にマッチします。

さらに、固定長の半角英数字を指定したい場合は^[a-zA-Z0-9]{n}$、例えば6桁の場合は^[a-zA-Z0-9]{6}$を使用します。同様に、最小桁数や最大桁数を指定することで柔軟なパターンを構築できます。例えば、12桁以上20桁以下に制限したい場合は^[a-zA-Z0-9]{12,20}$が有効です。

以下によく利用される正規表現パターンをまとめました。用途に応じてご活用ください。

#マッチ条件正規表現パターン
1すべて半角英数字^[a-zA-Z0-9]+$
2固定長 n桁の半角英数字^[a-zA-Z0-9]{n}$
3n桁以上の半角英数字^[a-zA-Z0-9]{n,}$
4m桁以下の半角英数字^[a-zA-Z0-9]{1,m}$
5n桁以上m桁以下の半角英数字^[a-zA-Z0-9]{n,m}$
正規表現のパターン一覧と条件

ソースコード

次に、入力された文字列が半角英数字のみで構成されているかを判定するJava関数を紹介します。この関数では、以下の条件に応じて検証が可能です。

  • 最小桁数を省略した場合: 文字列が指定された最大桁数以内で、半角英数字のみで構成されていることを確認します。
  • 最大桁数を省略した場合: 文字列が指定された最小桁数以上で、半角英数字のみで構成されていることを確認します。
  • 最小桁数・最大桁数を省略した場合: 文字列全体が、半角英数字のみで構成されていることを確認します。
/**
 * 文字列が半角英数字のみで構成されるかをチェックします。
 *
 * この関数は、文字列が指定された範囲内の桁数で構成され、
 * 半角英数字のみで構成されているかを確認します。
 *
 * @param str 入力文字列
 * @param minLength 最小桁数(nullの場合は1として扱います)
 * @param maxLength 最大桁数(nullの場合は文字列の長さを最大値として扱います)
 * @return 入力文字列が条件を満たす場合はtrue、それ以外はfalseを返します。
 * @throws IllegalArgumentException 最小桁数 が 1 未満の場合、または 最大桁数 が 最小桁数 未満の場合にスローされます。
 */
public static boolean isAlphanumeric(String str, Integer minLength, Integer maxLength) {
    if (str == null) {
        throw new IllegalArgumentException("文字列には null 以外を指定してください。");
    }

    int min = (minLength == null) ? 1 : minLength;
    int max = (maxLength == null) ? str.length() : maxLength;

    // 引数のバリデーション
    if (min < 1) {
        // 最小桁数が1未満の場合に例外をスロー
        throw new IllegalArgumentException("最小桁数は1以上の整数である必要があります。");
    }

    if (maxLength != null && max < min) {
        // 最大桁数が最小桁数未満の場合に例外をスロー
        throw new IllegalArgumentException("最小桁数は最大桁数以下である必要があります。");
    }

    // 正規表現パターンを構築
    String regex = (maxLength == null)
        ? String.format("^[a-zA-Z0-9]{%d,}$", min)            // 最大長さが指定されていない場合
        : String.format("^[a-zA-Z0-9]{%d,%d}$", min, max);    // 範囲が指定されている場合

    // 正規表現を使用して文字列を検証
    return Pattern.matches(regex, str);
}

テストケース

import java.util.regex.Pattern;

public class Main {

    /**
     * 文字列が半角英数字のみで構成されるかをチェックします。
     *
     * この関数は、文字列が指定された範囲内の桁数で構成され、
     * 半角英数字のみで構成されているかを確認します。
     *
     * @param str 入力文字列
     * @param minLength 最小桁数(nullの場合は1として扱います)
     * @param maxLength 最大桁数(nullの場合は文字列の長さを最大値として扱います)
     * @return 入力文字列が条件を満たす場合はtrue、それ以外はfalseを返します。
     * @throws IllegalArgumentException 最小桁数 が 1 未満の場合、または 最大桁数 が 最小桁数 未満の場合にスローされます。
     */
    public static boolean isAlphanumeric(String str, Integer minLength, Integer maxLength) {
        if (str == null) {
            throw new IllegalArgumentException("文字列には null 以外を指定してください。");
        }

        int min = (minLength == null) ? 1 : minLength;
        int max = (maxLength == null) ? str.length() : maxLength;

        // 引数のバリデーション
        if (min < 1) {
            // 最小桁数が1未満の場合に例外をスロー
            throw new IllegalArgumentException("最小桁数は1以上の整数である必要があります。");
        }

        if (maxLength != null && max < min) {
            // 最大桁数が最小桁数未満の場合に例外をスロー
            throw new IllegalArgumentException("最小桁数は最大桁数以下である必要があります。");
        }

        // 正規表現パターンを構築
        String regex = (maxLength == null)
            ? String.format("^[a-zA-Z0-9]{%d,}$", min) // 最大長さが指定されていない場合
            : String.format("^[a-zA-Z0-9]{%d,%d}$", min, max); // 範囲が指定されている場合

        // 正規表現を使用して文字列を検証
        return Pattern.matches(regex, str);
    }

    /**
     * テストコード用のメインメソッド。
     *
     * @param args コマンドライン引数 (未使用)
     */
    public static void main(String[] args) {
        // テストケース1: 正常 (条件を満たす)
        System.out.println("Test Case 1: " + isAlphanumeric("hello123", 3, 10)); // true

        // テストケース2: 最小桁数未満
        System.out.println("Test Case 2: " + isAlphanumeric("hello123", 10, null)); // false

        // テストケース3: 非アルファベット文字を含む
        System.out.println("Test Case 3: " + isAlphanumeric("hello!123", 1, null)); // false

        // テストケース4: 最大桁数を超える
        System.out.println("Test Case 4: " + isAlphanumeric("abc", null, 2)); // false

        // テストケース5: 正常 (半角英数字のみ)
        System.out.println("Test Case 5: " + isAlphanumeric("ABC123", 1, 6)); // true

        // テストケース6: 空文字列
        System.out.println("Test Case 6: " + isAlphanumeric("", 1, null)); // false

        // テストケース7: 長さ範囲内で半角英数字のみ
        System.out.println("Test Case 7: " + isAlphanumeric("test123", 4, 8)); // true

        // テストケース8: 最大桁数未指定で条件を満たす
        System.out.println("Test Case 8: " + isAlphanumeric("abcdef123", 5, null)); // true

        // テストケース9: 長さが最小桁数と一致
        System.out.println("Test Case 9: " + isAlphanumeric("abc", 3, 5)); // true

        // テストケース10: 長さが最大桁数と一致
        System.out.println("Test Case 10: " + isAlphanumeric("abcde", 1, 5)); // true
    }
}

Follow me!

photo by:Jonas Jacobsson