2014-04-11 2 views
0

강력한 암호를 사용하는 정규식을 작성하려고합니다. 내가 "qwer1234의 $"를 입력하면Javascript RegExp.test not working

/* Regular expression explained 
o Must contain at least one number: (?=.*\d) 
o Must contain at least one letter: (?=.*[a-zA-Z]) 
o Must contain at least one symbol: (?=.*[[email protected]#$*_=|?{}\[\]~\-,.]) 
o No whitespace:      (?=\S+$) 
o Length 8 - 25 characters long:  .{8,25} 
*/ 

pass = document.getElementById('password').value; 
var PwdRegExpStr = "^(?=.*\d)(?=.*[a-zA-Z])(?=.*[[email protected]#$*_=|?{}\[\]~\-,.])(?=\S+$).{8,25}$" 
var PwdRegExp = new RegExp(PwdRegExpStr); 
var PwdRegExpStr2 = "^.*(?=.{8,25})(?=.*[a-zA-Z])(?=.*\d)(?=.*[!#$?]).*$" 
var PwdRegExp2 = new RegExp(PwdRegExpStr2); 

var patt = /^(?=.*\d)(?=.*[a-zA-Z])(?=.*[[email protected]#$*_=|?{}\[\]~\-,.])(?=\S+$).{8,25}$/ 
var patt2 = /^.*(?=.{8,25})(?=.*[a-zA-Z])(?=.*\d)(?=.*[!#$%&? "]).*$/ 
alert("Pass:"+pass+" = "+PwdRegExp.test(pass)+" = "+PwdRegExp2.test(pass)+" = "+patt.test(pass)+" = "+patt2.test(pass)); 

나는 다음과 같은 결과를보고 있어요 : 패스 : qwer1234 $ = 거짓 거짓 = TRUE = TRUE

당신은 그들이 모두하지 않은 이유를 내가 이해하는 데 도움이 사실을 평가합니까?

감사합니다.

+0

아마도 정규식을 사용하여 _validate_ 암호를 사용하지 않는 것이 좋습니다. – devnull

+0

그건 이상한데, 난 좀 이상하다. 어느 쪽이든, (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions) 식 ('/^abc $ /. test ('abc ')') 가능한 경우 JavaScript에서. 그리고 그것은 '사실'을 돌려주는 것입니다. – Sam

+0

감사 샘, 사실 자바 스크립트 구성에서 최소 암호 길이를 전달 해요. 그래서 RegExp 버전을 사용하여 정규 표현식을 정의하기 전에 문자열에 연결해야합니다. – Giraffe

답변

2

주된 문제는 잘못된 도피입니다. 문자열 리터럴 형식으로 정규식을 지정하면 백 슬래시를 이스케이프 처리해야합니다. 그래서이 :

"^(?=.*\d)(?=.*[a-zA-Z])(?=.*[[email protected]#$*_=|?{}\[\]~\-,.])(?=\S+$).{8,25}$" 

...해야한다 :

보조 노트에
"^(?=.*\\d)(?=.*[a-zA-Z])(?=.*[[email protected]#$*_=|?{}\\[\\]~\\-,.])(?=\\S+$).{8,25}$" 

, 나는 \S{8,25}$ 할 때 (?=\S+$).{8,25}$ 쓰기 할 필요가 표시되지 않습니다. 그리고 다른 버전에서는 ^ 뒤에 여분의 .*이 적용됩니다. 여전히 작동하지만 정규식 엔진이해야하는 것보다 훨씬 많은 작업을 수행하고 있습니다.

+0

내 대답을 게시하려했으나 그 다음은 ... – tenub