[c#] 비밀번호가“대문자 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]*)$

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


답변

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

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

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

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

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

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)

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

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


답변

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

더 긴 정규식의 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();


답변

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

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


답변

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

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