Java
正規表現
パスワード

パスワードのための正規表現

More than 1 year has passed since last update.

正規表現を使ってパスワードのバリデーションをかけるには!
ということを理解できるまでに丸1日かけてしまったので
同じような人の参考まで。。。

要求仕様

※パスワードは以下をすべて使用して、8から48文字で入力する。
・小文字の半角アルファベット
・大文字の半角アルファベット
・半角数字
・記号(使用可能記号 !"#$%&'()*+,-./:;<=>?@[]^_`{|}~)

^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!-/:-@[-`{-~])[!-~]{8,48}$

Javaのサンプルコード

RegexPassword.java
package sample;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexPassword {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("^$|^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!-/:-@\\[-`{-~])[!-~]*");
        Matcher m = p.matcher("aA1!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~");
        Boolean result = m.matches();

        System.out.println("result:" + result);
    }
}

参考

正規表現の大前提を知るなら
正規表現の大前提を知るなら2

先読み・後読みが分かりやすい

ASCII文字コード表が見やすい

(?=.*[a-z]).*の必要性がわからない方には

Javaで正規表現を使うには

雑記

前提

言語:Java8

本題

パスワード用の正規表現について、
まずは肯定的先読みについて理解するために
動作確認用に以下のコードを書いて実行したところ
想定ではtrueが返ってくるはずがfalseで悩んでました。

package sample;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexWord {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("^(?=.*[a-z])");
        Matcher m = p.matcher("abc");
        Boolean result = m.matches();

        System.out.println("result:" + result);
    }
}

結論からいくと、Pattern p = 〜の行を以下のように書き換える必要がありました。
Pattern p = Pattern.compile("^(?=.*[a-z]).*");