25
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-13

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

25
29
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?