2014-09-14 2 views
2

나는 패스워드 검증 기능을 regexp와 함께 쓰려고하는데 어떻게해야할지 모르겠다. Golang 정규 표현식은 다른 언어와 다릅니다. 누군가에게 아이디어를 주시겠습니까?이 정규식 패턴은 어떻게 생겼을까요?
패턴은 검증 안 :regexp를 이용한 패스워드 검증

/* 
* Password rules: 
* at least 7 letters 
* at least 1 number 
* at least 1 upper case 
* at least 1 special character 
*/ 
+0

:

그러나, 간단한 예제를 구현하기 쉽습니다. 나는 대신 3 개의 regexes와 하나의'len()'호출을 사용했다. – Thomas

+0

어설 션을 사용하는 일반 정규식으로 쉽게 할 수 있습니다. 그렇지 않으면 간단한 일련의 문자 테스트 : 길이, 자릿수, 상위 알파, 구두점. – sln

+0

@ M42 관리자님께, re2 (http://code.google.com/p/re2/)를 사용하여 go regexp (http://golang.org/pkg/regexp/syntax/)에 "중복"질문을 적용 할 수 없습니다. wiki/Syntax, 효율적이고 원칙적인 정규 표현식 라이브러리). Go의 컨텍스트에서이 **는 중복되지 않습니다 **. – VonC

답변

6

오른쪽 정규 표현식이 될 것이다 ... 어떤 정규 표현식을 여기에.

당신은 암호의 유효성을 검사 할 사용자 정의 함수를 정의하고, (다른 프레임 워크가 유사한 검증을 정의 할 수 있습니다 whic (이 discussion about parameter validation에서 언급) mccoyst/validate 같은 필드,

또한 go-validator/validator이 검증 돕는와 결합 할 수 있습니다 하지만 난 여전히 하나 또는 여러 regexps 대신 사용자 정의 유효성 검사기를 사용합니다).


참고 : go regexpre2, 효율적인, 원칙 정규 표현식 라이브러리)을 기반으로합니다. (abc)\1일치하는 모습 비하인드 :

그래서 주요 무역 오프는 예를 들어 에는 백 참조 없습니다.
당신은 고속 정규식을 얻습니다.

+0

왜 regexps, 나쁘지 않아? –

+0

@zero_coding 여기에 * 1 * regexp에서 제약 조건을 쉽게 표현할 수 없기 때문에 여기에 있습니다. 그래서 ... http://programmers.stackexchange.com/q/223634/3915 및 http://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/ – VonC

+0

디자이너 디자이너가 된 이유는 무엇입니까? 다른 정규식 그러면 다른 언어? 그 이유는 무엇입니까? –

9

Go의 regex은 역 추적을 지원하지 않기 때문에 실제로 불가능합니다. 하나의 정규식에 어려운이 표현

func verifyPassword(s string) (sevenOrMore, number, upper, special bool) { 
    letters := 0 
    for _, s := range s { 
     switch { 
     case unicode.IsNumber(s): 
      number = true 
     case unicode.IsUpper(s): 
      upper = true 
      letters++ 
     case unicode.IsPunct(s) || unicode.IsSymbol(s): 
      special = true 
     case unicode.IsLetter(s) || s == ' ': 
      letters++ 
     default: 
      //return false, false, false, false 
     } 
    } 
    sevenOrMore = letters >= 7 
    return 
}