Java 正規表現

6月 17, 2020

正規表現とは

正規表現とは、文字列の集合を一つの文字列で表現する方法です。

Javaでの正規表現のルール

^ は行の先頭を表します。
$ は行の末尾を表します。
. は任意の一文字を表します。
これらの正規表現のルールを表す記号を「メタ文字」と呼びます。メタ文字を記号として利用した場合はメタ文字の前に / (スラッシュ) をつけます

メールアドレスの正規表現

入力された文字列がメールアドレスかどうかを判断する場合に、以下のようなメールアドレスの正規表現を利用します。

import java.util.*;
public class Main {
    public static void main(String[] args) throws Exception {
		//String mailAddress = "hogehoge@hoge.com";
		//String mailAddress = "hogehoge@hogecom";
		String mailAddress = "hogehogehoge.com";
		String mailFormat = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$";
		if (!mailAddress.matches(mailFormat)) {
		    System.out.println(mailAddress + "はメールアドレスではありません。");
		} else {
		    System.out.println(mailAddress + "はメールアドレスです。");
		}
    }
}

上記コードを確認するためには、このサイトが便利です。いろいろと改善の余地がありますが、最低限のメールアドレスの入力チェックならこれでOKでしょう。

パスワードの正規表現

入力された文字列がパスワードで許可されている文字に合致しているかどうかを判断する場合に、以下のようなパスワードの正規表現を利用します。

import java.util.*;
public class Main {
  public static void main(String[] args) throws Exception {
    //String password = "1234^aaa";
    String password = "1234~aaa";
    String passwordFormat = "^[a-zA-Z0-9_-~]*$";
    if (password.matches(passwordFormat)) {
      System.out.println(password + "は、正規表現にマッチしています。OK");
    } else {
      System.out.println(password + "は、正規表現にマッチしていません。NG");
    }
  }
}

上記コードを確認するためには、このサイトが便利です。いろいろと改善の余地がありますが、パスワードの入力文字のチェックについては、これをベースに考えて作ればOKです。

パスワードの条件が、半角数字を1文字以上含む、かつ半角英字を1文字以上含むような場合の正規表現

以下のように複数の正規表現を作り、理論積(&&)を使うことで分かりやすく表現することが出来ます。

import java.util.*;
public class Main {
    public static void main(String[] args) throws Exception {
		//String password = "1234^aaa";
		//String password = "a12345678";
		String password = "2ab-cdefg";
		String ruleContainsAlphabet = ".*[a-zA-Z].*";     // 1文字以上の半角アルファベットが必ず含まれていることを表す正規表現
		String ruleContainsNumber = ".*[0-9].*";          // 1文字以上の半角数値が必ず含まれていることを表す正規表現
		String ruleAllowedCharacter = "^[a-zA-Z0-9-]*$";  // 許可される文字は半角英数字と特定の記号のみであることを表す正規表現
		if (password.matches(ruleContainsAlphabet) && password.matches(ruleContainsNumber) && password.matches(ruleAllowedCharacter)) {
			System.out.println(password + "は、正規表現にマッチしています。OK");
		} else {
			System.out.println(password + "は、正規表現にマッチしていません。NG");
		}
    }
}

(実行結果)
2ab-cdefgは、正規表現にマッチしています。OK