正規表現を使ってパスワードのバリデーションをかけるには!
ということを理解できるまでに丸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);
}
}
参考
雑記
前提
言語: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]).*");