비밀번호가“대문자 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,}$/
'code' 카테고리의 다른 글
Swift의 블록 (animateWithDuration : animations : completion :) (0) | 2020.08.17 |
---|---|
자바의 유사성 문자열 비교 (0) | 2020.08.17 |
ListView가 맨 아래로 스크롤되었는지 확인 하시겠습니까? (0) | 2020.08.17 |
'node-sass'모듈을 찾을 수 없음의 오류 (0) | 2020.08.17 |
"열기 / 닫기"SqlConnection 또는 계속 열려 있습니까? (0) | 2020.08.16 |