正規表現でパスワードを検証する方法

正規表現でパスワードを検証する方法

パスワードの正規表現パターン

((?=.*\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
===============================================