3

我是正则表达式的新手,并试图创建一个正则表达式来验证密码短语。我想验证密码短语是否具有:

  • n 字数或更多
  • 单词应该用空格分隔
  • 单词,每个单词有 n 个或更多字符
  • 至少一个单词中的数字
  • 其中一个词中至少有一个特殊字符

这就是我到目前为止所拥有的

^(?=.*?((?:.*?\b[a-zA-Z0-9]{2,40}\b)\s*){3,})(?=.*?[@#$%^&+=])(?=.*?[0-9]).*$

它匹配这个Pe2sI#sHy?ThYulU#词组,该词组没有至少 3 个单词(没有空格)。我究竟做错了什么?

4

2 回答 2

3

您应该使用\s+而不是\s*. 后者允许零个空格,前者至少需要一个。但是您的正则表达式过于复杂。尝试这个:

^                 # Start of string
(?=.*\d)          # Assert at least one digit
(?=.*[@#$%^&+=])  # Assert at least one special char
\s*               # Optional leading whitespace
(?:               # Match...
 \S{2,}           #  at least 2 non-spaces
 \s+              #  at least 1 whitespace
){2,}             # at least 2 times
\S{2,}            # Match at least 2 non-spaces (making 3 "words" minimum)
于 2012-04-25T20:14:05.180 回答
2

这有点晚了,所以这只是一个观察。

这是@Tim Pietzcker 方法的起飞。
虽然 'words' 可以是任何东西,但如果您希望至少
3 个单词嵌入 [a-zA-Z0-9]{2,40} 个字符,您可以这样做。

^                      # String start
(?=.*[@#$%^&+=])       # Assert 1 special char
(?=.*\d)               # Assert 1 digit
(?:                    # Special 'Word Group'  -- Need 2 words
   .*                     # Any char, 0 or more times
   [a-zA-Z0-9]{2,40}      # Alpha/num char, 2 to 40 times
   .*                     # Any char, 0 or more times
   \s                     # a whitespace, only 1 required
){2}                   # 'Word Group' end, do 2 times
.*                     # Any char, 0 or more times
[a-zA-Z0-9]{2,40}      # Alpha/num char, 2 to 40 times -- Need 1 word

这应该匹配至少 3 个特殊的 [a-zA-Z0-9]{2,40} 单词,由至少 1 个空格分隔,
包括一个数字和特殊字符。

更新

是的,您可以用我知道的 2 种方法将它组合成一个组,完成 {3} 次。

使用捕获缓冲区作为标志

^(?=.*[@#$%^&+=])(?=.*\d)(?:(?:(?!\1)|\s).*[a-zA-Z0-9]{2,40}().*){3} 
                                                       ^          ^
---------------------------------------   

^                      # String start
(?=.*[@#$%^&+=])       # Assert 1 special char
(?=.*\d)               # Assert 1 digit
(?:                    # Special 'Word Group'
   (?:                    #.. grping start ....
        (?!\1)              # Either capt group 1 is UN-DEFINED
      | \s                  # OR, require a whitespace
    )                     #.. grping end ....
   .*                     # Any char, 0 or more times
   [a-zA-Z0-9]{2,40}      # Alpha/num char, 2 to 40 times
   ()                     # DEFINE Capture group 1
   .*                     # Any char, 0 or more times
){3}                   # 'Word Group' end, do 3 times

或者,通过使用条件

^(?=.*[@#$%^&+=])(?=.*\d)(?:(?(1)\s).*([a-zA-Z0-9]{2,40}).*){3}
                                                   ^         ^
---------------------------------------   

^                      # String start
(?=.*[@#$%^&+=])       # Assert 1 special char
(?=.*\d)               # Assert 1 digit
(?:                    # Special 'Word Group'
   (?(1)\s)               # Conditional, require a whitespace if capture group 1 captured anything
   .*                     # Any char, 0 or more times
   ([a-zA-Z0-9]{2,40})    # Capture group 1, Alpha/num char, 2 to 40 times
   .*                     # Any char, 0 or more times
){3}                   # 'Word Group' end, do 3 times
于 2012-04-25T21:47:21.473 回答