code

비밀번호가“대문자 1 개, 특수 문자 1 개, 영숫자 포함 8 자”인지 확인하는 정규식

codestyles 2020. 8. 17. 08:57
반응형

비밀번호가“대문자 1 개, 특수 문자 1 개, 영숫자 포함 8 자”인지 확인하는 정규식


정규 표현식을 사용하여

암호는 대문자 1 개, 특수 문자 1 개 및 영숫자를 포함하여 8 자 여야합니다.

그리고 여기에 대문자 1 개, 소문자 1 개, 숫자 또는 특수 문자 1 개를 포함하여 8 자에 대한 유효성 검사 표현식이 있습니다.

(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"

대문자 1 개, 특수 문자 1 개, 영숫자 문자를 포함하여 8 자 여야하는 비밀번호를 작성하려면 어떻게해야합니까?


당신이 추구하는 정규 표현식은 특히 정규 표현식에 익숙하지 않은 사람들을 위해 유지하기에는 거대하고 악몽 일 것입니다.

정규식을 분해하고 한 번에 하나씩 수행하는 것이 더 쉬울 것이라고 생각합니다. 더 많은 작업이 필요할 수 있지만 유지 관리 및 디버깅이 더 쉬울 것이라고 확신합니다. 이렇게하면 사용자에게보다 자세한 오류 메시지를 제공 할 수 Invalid Password있어 사용자 경험을 향상시킬 수 있습니다 ( 단지는 제외).

내가보기에 당신은 정규식에 꽤 유창하므로 필요한 일을하기 위해 정규식을 제공하는 것은 쓸모가 없을 것이라고 생각합니다.

귀하의 의견을 보면 다음과 같이 할 것입니다.

  • 8 자 여야합니다.이 경우 정규식이 필요하지 않습니다. .Length속성을 사용하면 충분합니다.

  • 대문자 1 개 포함 : [A-Z]+정규식을 사용할 수 있습니다 . 문자열에 하나 이상의 대문자가 포함 된 경우이 정규식은 true.

  • 하나의 특수 문자 : \W문자 나 숫자가 아닌 모든 문자와 일치하는를 사용할 수 있습니다. 그렇지 않으면 이와 같은 [!@#]것을 사용하여 특수 문자의 사용자 지정 목록을 지정할 수 있습니다 . 주 같은 그 자하지만 $, ^, (그리고 )그들과 같이 이스케이프 할 필요가 있으므로, 정규 표현식 언어의 특수 문자입니다 \$. 즉, \W.

  • 영숫자 :를 사용하면 \w+문자, 숫자 및 밑줄과 일치해야합니다.

자세한 내용 튜토리얼을 참조하십시오.


(                   # Start of group
    (?=.*\d)        #   must contain at least one digit
    (?=.*[A-Z])     #   must contain at least one uppercase character
    (?=.*\W)        #   must contain at least one special symbol
       .            #     match anything with previous condition checking
         {8,8}      #        length is exactly 8 characters
)                   # End of group

한 줄로 :

((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})

2019-05-28 수정 :

전체 입력 문자열과 일치해야합니다. 따라서 실수로 부분 일치가 전체 입력과 일치한다고 가정하는 것을 방지하기 위해 ^사이에 정규식을 묶을 수 있습니다 $.

^((?=.*\d)(?=.*[A-Z])(?=.*\W).{8,8})$

출처 :


너무 많은 답변 .... 모두 나쁘다!

정규식에는 AND 연산자가 없으므로 유효성이 무언가와 다른 무언가에 의해 정의 될 때 유효한 암호와 일치하는 정규식을 작성하기가 매우 어렵습니다.

그러나, 정규 표현식 , 그래서 그냥 드 모르 강의 법칙을 적용하고, 일치하는 정규식 쓰기는 OR 연산자가 잘못된 암호를.

8 자 미만 무엇이든 또는 어떤 번호가 무엇이든 또는 어떤 대문자 아무것도 또는 특수 문자 아무것도

그래서:

^(.{0,7}|[^0-9]*|[^A-Z]*|[a-zA-Z0-9]*)$

일치하는 것이 있으면 잘못된 암호입니다.


예를 들어 읽기 / 유지 관리가 가능한 정규식으로 이것이 어떻게 수행 될 수 있는지.

더 긴 정규식의 RegexOptions.IgnorePatternWhitespace경우 더 나은 가독성을 위해 항상 식에 공백과 주석을 허용 하는 사용해야 합니다.

String[] passwords = { "foobar", "Foobar", "Foobar1", "Fooobar12" };

foreach (String s in passwords) {

    Match password = Regex.Match(s, @"
                                      ^              # Match the start of the string
                                       (?=.*\p{Lu})  # Positive lookahead assertion, is true when there is an uppercase letter
                                       (?=.*\P{L})   # Positive lookahead assertion, is true when there is a non-letter
                                       \S{8,}        # At least 8 non whitespace characters
                                      $              # Match the end of the string
                                     ", RegexOptions.IgnorePatternWhitespace);

    if (password.Success) {
        Console.WriteLine(s + ": valid");
    }
    else {
        Console.WriteLine(s + ": invalid");
    }
}

Console.ReadLine();

대답은 정규식을 사용하지 않는 것입니다. 이것은 세트와 계산입니다.

정규 표현식은 순서에 관한 것입니다.

프로그래머로서의 삶에서 말이되지 않는 많은 일을하도록 요구할 것입니다. 레벨을 더 깊이 파헤치는 법을 배우십시오. 질문이 틀렸을 때 배우십시오.

질문 (정규식을 언급 한 경우)이 잘못되었습니다.

의사 코드 (최근 너무 많은 언어간에 전환됨) :

if s.length < 8:
    return False
nUpper = nLower = nAlphanum = nSpecial = 0
for c in s:
    if isUpper(c):
        nUpper++
    if isLower(c):
        nLower++
    if isAlphanumeric(c):
        nAlphanum++
    if isSpecial(c):
        nSpecial++
return (0 < nUpper) and (0 < nAlphanum) and (0 < nSpecial)

위의 코드를 거의 즉시 읽고 이해했을 것입니다. 정규식에 훨씬 더 오래 걸렸고 그것이 정확하다는 확신이 덜합니다. 정규식을 확장하는 것은 위험합니다. 바로 위의 확장은 훨씬 적습니다.

또한 질문이 부정확하게 표현되어 있습니다. 문자 집합이 ASCII 또는 유니 코드입니까? 질문을 읽은 내 추측은 적어도 하나의 소문자가 가정된다는 것입니다. 따라서 가정 된 마지막 규칙은 다음과 같아야합니다.

return (0 < nUpper) and (0 < nLower) and (0 < nAlphanum) and (0 < nSpecial)

(보안 중심으로 변경하는 것은 정말 성가 시거나 유용하지 않은 규칙입니다.)

질문이 틀렸을 때 아는 것을 배우는 것이 영리한 답변보다 훨씬 더 중요합니다. 잘못된 질문에 대한 영리한 대답은 거의 항상 잘못되었습니다.


대문자와 특수 문자가 하나만 필요한 경우 다음이 작동합니다.

@"^(?=.{8,}$)(?=[^A-Z]*[A-Z][^A-Z]*$)\w*\W\w*$"

찾고 있던 정규식은 다음과 같습니다 /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*\[\]"\';:_\-<>\., =\+\/\\]).{8,}$/u.

예제 및 테스트 : http://regexr.com/3fhr4


이 질문은 바이러스 성으로 시작되고 많은 흥미로운 제안이 나타났습니다.

네, 손으로 쓰는 것은 어렵습니다. 따라서 더 쉬운 해결책은 템플릿을 사용하는 것입니다. 결과 정규식이 최적이 아닐 수 있지만 유지 관리 및 / 또는 변경이 더 쉬우 며 사용자가 결과를 더 잘 제어 할 수 있습니다. 내가 뭔가를 놓쳤을 가능성이 있으므로 건설적인 비판이 도움이 될 것입니다.

이 링크는 흥미로울 수 있습니다. 문자열에서 순서에 관계없이 최소 2 자리 2 문자 일치 , 정규식 언어 , 그룹 캡처

나는 내가 본 (?=(?:.*?({type})){({count})})모든 정규식을 기반 으로이 템플릿을 사용하고 있습니다. 다음 단계는 필요한 패턴 ( number, special character...)을 교체하고 길이에 대한 구성을 추가하는 것입니다.

정규식 PasswordRegexGenerator.cs 작성을위한 작은 클래스를 만들었습니다 . 예 :

string result = new PasswordRegexGenerator ( )
        .UpperCase ( 3, -1 )    // ... {3,}
        .Number ( 2, 4 )        // ... {2,4}
        .SpecialCharacter ( 2 ) // ... {2}
        .Total ( 8,-1 )
        .Compose ( );

/// <summary>
/// Generator for regular expression, validating password requirements.
/// </summary>
public class PasswordRegexGenerator
{
    private string _elementTemplate = "(?=(?:.*?({type})){({count})})";

    private Dictionary<string, string> _elements = new Dictionary<string, string> {
        { "uppercase", "[A-Z]" },
        { "lowercase", "[a-z]" },
        { "number", @"\d" },
        { "special", @"\W" },
        { "alphanumeric", @"\w" }
    };

    private StringBuilder _sb = new StringBuilder ( );

    private string Construct ( string what, int min, int max )
    {
        StringBuilder sb = new StringBuilder ( _elementTemplate );
        string count = min.ToString ( );

        if ( max == -1 )
        {
            count += ",";
        }
        else if ( max > 0 )
        {
            count += "," + max.ToString();
        }

        return sb
            .Replace ( "({type})", what )
            .Replace ( "({count})", count )
            .ToString ( );
    }

    /// <summary>
    /// Change the template for the generation of the regex parts
    /// </summary>
    /// <param name="newTemplate">the new template</param>
    /// <returns></returns>
    public PasswordRegexGenerator ChangeRegexTemplate ( string newTemplate )
    {
        _elementTemplate = newTemplate;
        return this;
       }

    /// <summary>
    /// Change or update the regex for a certain type ( number, uppercase ... )
    /// </summary>
    /// <param name="name">type of the regex</param>
    /// <param name="regex">new value for the regex</param>
    /// <returns></returns>
    public PasswordRegexGenerator ChangeRegexElements ( string name, string regex )
    {
        if ( _elements.ContainsKey ( name ) )
        {
            _elements[ name ] = regex;
        }
        else
        {
            _elements.Add ( name, regex );
        }
        return this;
    }

    #region construction methods 

    /// <summary>
    /// Adding number requirement
    /// </summary>
    /// <param name="min"></param>
    /// <param name="max"></param>
    /// <returns></returns>
    public PasswordRegexGenerator Number ( int min = 1, int max = 0 )
    {
        _sb.Append ( Construct ( _elements[ "number" ], min, max ) );
        return this;
    }

    public PasswordRegexGenerator UpperCase ( int min = 1, int max = 0 )
    {
        _sb.Append ( Construct ( _elements[ "uppercase" ], min, max ) );
        return this;
    }

    public PasswordRegexGenerator LowerCase ( int min = 1, int max = 0 )
    {
        _sb.Append ( Construct ( _elements[ "lowercase" ], min, max ) );
        return this;
    }

    public PasswordRegexGenerator SpecialCharacter ( int min = 1, int max = 0 )
    {
        _sb.Append ( Construct ( _elements[ "special" ], min, max ) );
        return this;
    }

    public PasswordRegexGenerator Total ( int min, int max = 0 )
    {
        string count = min.ToString ( ) + ( ( max == 0 ) ? "" : "," + max.ToString ( ) );
        _sb.Append ( ".{" + count + "}" );
        return this;
    }

    #endregion

    public string Compose ()
    {
        return "(" + _sb.ToString ( ) + ")";
    }
}

유효성 검사를 위해 아래 클래스를 사용할 수 있습니다.

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();

  }
}

여기서 6과 20은 암호의 최소 및 최대 길이입니다.


  • 비역 추적 표현식을 사용하여 전체 비밀번호가 8 자 이상인 경우 먼저 전체 비밀번호를 일치 시키십시오 (이렇게하면 길지만 유효하지 않은 비밀번호에 대한 조합 폭발이 없습니다). (?>{8,})
  • 모든 필수 문자 (AND 조건)가 있는지 확인하려면 lookbehind 어설 션을 사용하십시오. (?<=...)
  • 적어도 하나의 대문자: (?<=\p{Lu}.*)
  • 하나 이상의 특수 문자 (조금 모호하지만 단어가 아닌 것을 사용합시다) : (?<=\W.*)
  • 하나 이상의 영숫자 (: (?<=\w.*)

Summed up:

(?>.{8,})(?<=\p{Lu}.*)(?<=\W.*)(?<=\w.*)


/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$/

참고URL : https://stackoverflow.com/questions/9477906/regular-expression-to-check-if-password-is-8-characters-including-1-uppercase-l

반응형