2011-10-26 2 views
0

임은 다음과 같습니다 멋진 정규 표현식 빌더를 가지고 :정규 표현식 C#을 암호는 공백을 제거

string numberOfDigits = "2"; 
string numberOfCaps = "2"; 
string numberOfChars = "3"; 
string numberOfNonAlpha = "3"; 
string minLength = "10"; 

string rexExString = "^(?=.*\\d{" + numberOfDigits + "})(?=.*[A-Z]{" + numberOfCaps + "})(?=.*[a-z]{" + numberOfChars + "})(?=.*[[email protected]#$%^&*()]{" + numberOfNonAlpha + "}).{" + minLength + ",}$"; 

출력은 다음됩니다

^(?=.*\d{2})(?=.*[A-Z]{2})(?=.*[a-z]{3})(?=.*[[email protected]#$%^&*()]{3}).{10,}$ 

내가 얼마나 많은 숫자, 문자를 지정할 수 있습니다이 방법 , nonalpha 등 내 비밀 번호를 원한다. 나는 그것을 이렇게 유지하고 싶다. 유일한 문제는 그것도 공백을 허용하고, 내 암호에 대한 그걸 원하지 않는다는 것입니다.

내 질문 형식으로 내 정규식에 공백이 있지만, 그것을 유지 그래서 내가 위의 예에서와 같이 변수를 지정할 수 있습니다 허용하지하는 방법

.

^(?=.*\d{2})(?=.*[A-Z]{2})(?=.*[a-z]{3})(?=.*[[email protected]#$%^&*()]{3}).{10,}$ 
+1

정규식을 사용하면 다른 체크와 마찬가지로 2 자리 숫자가 함께 표시됩니다 - 실제로 원하는 것입니까? 대부분의 암호 정책은 문자의 수를 주장하며 발생 위치가 아닙니다. –

+0

'\ d'을 사용하지 마십시오. '[0-9]'를 사용해야합니다. '\ d'는 비 유럽 언어와 일치합니다. http://msdn.microsoft.com/en-us/library/w1c0s6bb.aspx – xanatos

답변

1

문제는 당신의 형식으로 공백이없는

\S{" + minLength + ",}$ 

참고이 문제는 마지막에 당신의 .{10,}와 모든 문자를 사용할 수 있다는 것입니다.

이 대신

\S{10,} 

\S는 ([^\s] 동일) Btw는 공백

아니다보십시오. (?=.*\d{2})이라는 시퀀스에서 2 자리 숫자를 사용하고 전체 숫자 두 자리를 원하지 않는다는 것을 알고 계십니까? 즉, Foo1bar2는 허용되지 않습니다.

어떻게하면 간단하게 할 수 있습니까?

모든 요구 사항을 하나의 정규 표현식에 넣는 것은 약간 어렵습니다. 특히 구성 할 수있는 자릿수를 암호가 아닌 순서대로 분배 할 수 있도록하려는 경우.

왜이 확인 과정을 약간 분할하지 마십시오.

^\S{10,}$을 확인하여 비밀번호에 10 자 이상의 공백 문자가 있는지 확인할 수 있습니다.

그런 다음 문자 유형을 계산할 수 있습니다. 같은 :

MatchCollection uppercase = Regex.Matches(s, @"\p{Lu}"); 
MatchCollection lowercase = Regex.Matches(s, @"\p{Ll}"); 
MatchCollection digits = Regex.Matches(s, @"\p{N}"); 
MatchCollection nonAlpha = Regex.Matches(s, @"[\p{N}\p{L}]"); 

Console.WriteLine("Upper: " + uppercase.Count); 
Console.WriteLine("Lower: " + lowercase.Count); 
Console.WriteLine("Digits: " + digits.Count); 
Console.WriteLine("NonAlpha: " + nonAlpha.Count); 

그냥 당신이 원하는 클래스의 하나의 문자와 일치하고 MatchCollectioncount() 방법을 사용하여 해당 문자의 양을 얻을.

여기서 유니 코드 속성 (\p{...})을 사용 했으므로 원하는 문자 클래스로 쉽게 변경할 수 있습니다. 여기에 있습니다 overview over the Unicode properties on regular-expressions.info

그런 다음 각 문자 유형의 양을 가져 와서 해당 특정 유형에 필요한 번호와 비교할 수 있습니다.

이것은 훨씬 읽기 쉽고 유지 보수가 쉬운 기능입니다.

+0

@Vincent Van Eijsden, 제 답변을 업데이트했습니다. – stema

+0

감사합니다. 전 정말로 모든 것을 함께 복사하여 붙여 넣었습니다. 그걸 다루는 방식이 제 sitiuation에 이상적입니다. 감사합니다. –

1

대신 결국 .{10,}$를 사용하면이어야 10 비 공백 문자 \S{10,}$가되도록 지정할 수 있습니다. 대문자 S.

1
Regex rx = new Regex(@"^((?<N>[0-9])|(?<CU>[A-Z])|(?<CL>[a-z])|(?<NA>[[email protected]#$%&*()^])|)*$(?<-N>){3}(?<-CU>){1}(?<-CL>){2}(?<-NA>){4}"); 

이 정규식은 다양한 유형의 문자를 "축적"하기 위해 균형 조정 그룹을 사용합니다. 안으로 들어 있지 않은 문자 (해당 그룹 + 공백)를 거부합니다. 따라서 예를 들어 è은 거부됩니다. 값을 변경하려면 |)|.)으로 바꿉니다.

문자열 끝에 ($) 모든 다양한 "스택"에 충분한 문자가 있는지 확인합니다. 분명히 {3}, {1}, {2}, {4}이 보이는 곳에 번호를 써야합니다.

이 정규식의 흥미로운 점은 1!A!a!2!b3에서 작동한다는 것입니다. 다양한 문자 클래스가 연속적 이길 원한다면 (이 경우 123Abc!!!!)이 정규식은 "좋지"않습니다.