정규 표현식을 사용하여
암호는 대문자 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