2011-01-25 3 views
3

ASP.NET MVC3 앱의 복잡성에 대한 비밀번호의 유효성을 검사합니다. 내 현재 요구 사항은 최소한 하나의 대문자, 하나의 소문자, 한 자릿수 및 세 개 이상의 반복 문자를 포함해야한다는 것입니다. 나는 그 숫자를 일반화하고 비 영숫자 문자 조건을 추가하고 싶습니다.임의의 순서로 여러 패턴을 일치시키는 정규식

현재 서버 쪽만 유효성을 검사하고 있으므로 Regex.IsMatch를 각 조건에 대해 하나의 정규식을 사용하여 여러 번 호출 할 수 있습니다. 나는 클라이언트 쪽도 유효성을 검사 할 수 있기를 원한다. 눈에 거슬리는 jQuery 유효성 검사는 하나의 정규식 만 허용하므로 모든 다섯 조건을 단일 패턴으로 결합해야합니다.

정규 표현식에 관해서 많이 알지는 않지만 최근에 약간의 독서를하고 있습니다. 나는 간단한 것을 놓치고 있을지도 모르지만 여러 패턴을 함께 AND하는 방법을 찾지 못한다. 그것들을 OR 할 것입니다.

답변

9

단일 정규식에 여러 lookahead assertions와 (.NET에서)이 작업을 수행 할 수있는 모든 조건에 해당하는 경우

^(?=.*\p{Lu})(?:.*\p{Ll})(?=.*\d)(?=.*\W)(?!.*(.).*\1.*\1) 

이 일치합니다. 당신이 매치 조작, 당신에 대해 일치하고있는 문자열을 반환 정규식의 끝에서 .*을 추가 할 경우 - 경기 문자열의 모든 문자를 소비하지 않을 것을

^     # Match the start of the string 
(?=.*\p{Lu})  # True if there is at least one uppercase letter ahead 
(?=.*\p{Ll})  # True if there is at least one lowercase letter ahead 
(?=.*\d)   # True if there is at least one digit ahead 
(?=.*\W)   # True if there is at least one non-alnum character ahead 
(?!.*(.).*\1.*\1) # True if there is no character repeated twice ahead 

참고.

JavaScript에서는 유니 코드 문자 속성을 사용할 수 없습니다. 그래서 대신 사용할 수 있습니다

^(?=.*[A-Z])(?:.*[a-z])(?=.*\d)(?=.*\W)(?!.*(.).*\1.*\1) 

물론 유효성 검사에 ASCII 문자를 사용합니다. 괜찮으 시다면, 괜찮아요. 너는 [A-ZÄÖÜÀÈÌÒÙÁÉÍÓÚ] 등등과 같은 특성 종류를 갈고 갈 수 있었다 그러나 너는 아마 이것으로 완전하지 않을 텐데. 서버 측에서는 유효성 검사 결과가 동일하게 나타나도록하려면 RegexOptions.ECMAScript을 지정해야 .NET 정규식 엔진이 JavaScript 엔진처럼 작동합니다 (Alan Moore에게 감사드립니다!).

+0

Rubular에서 작동하도록이 패턴을 얻는 데 어려움을 겪고 있습니다. http://rubular.com/r/008s20R3fa –

+2

@dorkitude : 1.9보다 앞선 루비 정규 표현식은'\ p {Lu }'와'\ p {LI}'. 다음과 같이 .NET 구동 테스터에서 시도해보십시오. http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx –

+0

예, Ruby는 지원하지 않습니다. 유니 코드 문자 속성 ('\ p {Lu}'등), 루비가 사용하는 루비 1.8 이상은 생각합니다. 대신에 [[A-Z]'를 사용하고'\ p {Ll}'에'[a-z]'를 쓰면 제대로 동작 할 것입니다. –

관련 문제