正規表現でパスワードを検証する方法
パスワードの正規表現パターン
((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})
説明
( # Start of group (?=.*\d) # must contains one digit from 0-9 (?=.*[a-z]) # must contains one lowercase characters (?=.*[A-Z]) # must contains one uppercase characters (?=.*[@#$%]) # must contains one special symbols in the list "@#$%" . # match anything with previous condition checking {6,20} # length at least 6 characters and maximum of 20 ) # End of group
?= –アサーション条件を適用することを意味します。それ自体は意味がなく、常に他の組み合わせで動作します
全体の組み合わせは、少なくとも1つの数字、1つの大文字、1つの小文字、1つの特殊記号(「@#$%」)を含む6〜20文字の文字列です。 この正規表現パターンは、強力で複雑なパスワードを実装するのに非常に役立ちます。
P.S The grouping formula order is doesn’t matter.
1. Java正規表現の例
PasswordValidator.java
package com.example.regex; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PasswordValidator{ private Pattern pattern; private Matcher matcher; private static final String PASSWORD_PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})"; public PasswordValidator(){ pattern = Pattern.compile(PASSWORD_PATTERN); } /** * Validate password with regular expression * @param password password for validation * @return true valid password, false invalid password */ public boolean validate(final String password){ matcher = pattern.matcher(password); return matcher.matches(); } }
2. 一致するパスワード:
1. example1A@
2. mkYOn12 $
3. 一致しないパスワード:
1. mY1A @、短すぎる、最小6文字
2。 example12 @、大文字が必要です
3。 mkyoNg12 *、特殊記号「*」はここでは許可されていません
4。 mkyonG $$、数字が必要です
5。 MKYONG12 $、小文字が必要です
4. 単体テスト-PasswordValidator
TestNGを使用した単体テスト。
PasswordValidatorTest.java
package com.example.regex; import org.testng.Assert; import org.testng.annotations.*; /** * Password validator Testing * @author example * */ public class PasswordValidatorTest { private PasswordValidator passwordValidator; @BeforeClass public void initData(){ passwordValidator = new PasswordValidator(); } @DataProvider public Object[][] ValidPasswordProvider() { return new Object[][]{ {new String[] { "example1A@", "mkYOn12$", }} }; } @DataProvider public Object[][] InvalidPasswordProvider() { return new Object[][]{ {new String[] { "mY1A@","example12@","mkyoNg12*", "mkyonG$$","MKYONG12$" }} }; } @Test(dataProvider = "ValidPasswordProvider") public void ValidPasswordTest(String[] password) { for(String temp : password){ boolean valid = passwordValidator.validate(temp); System.out.println("Password is valid : " + temp + " , " + valid); Assert.assertEquals(true, valid); } } @Test(dataProvider = "InvalidPasswordProvider", dependsOnMethods="ValidPasswordTest") public void InValidPasswordTest(String[] password) { for(String temp : password){ boolean valid = passwordValidator.validate(temp); System.out.println("Password is valid : " + temp + " , " + valid); Assert.assertEquals(false, valid); } } }
5. 単体テスト-結果
Password is valid : example1A@ , true Password is valid : mkYOn12$ , true Password is valid : mY1A@ , false Password is valid : example12@ , false Password is valid : mkyoNg12* , false Password is valid : mkyonG$$ , false Password is valid : MKYONG12$ , false PASSED: ValidPasswordTest([Ljava.lang.String;@1d4c61c) PASSED: InValidPasswordTest([Ljava.lang.String;@116471f) =============================================== com.example.regex.PasswordValidatorTest Tests run: 2, Failures: 0, Skips: 0 =============================================== =============================================== example Total tests run: 2, Failures: 0, Skips: 0 ===============================================