3

私は正規表現の初心者であり、パスフレーズを検証するための正規表現を作成しようとしています。パスフレーズに次の内容があることを確認したいと思います。

  • n語以上
  • 単語はスペースで区切る必要があります
  • それぞれn文字以上の単語
  • 少なくとも1つの単語の数字
  • 単語の1つに少なくとも1つの特殊文字

これは私が今まで持っているものです

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

Pe2sI#sHy?ThYulU#3語以上(スペースなし)のこのフレーズに一致します。私は何が間違っているのですか?

4

2 に答える 2

3

\s+の代わりに使用する必要があり\s*ます。後者はゼロスペースを許可し、前者は少なくとも1つを必要とします。しかし、正規表現は非常に複雑です。これを試して:

^                 # 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

これには少し遅れているので、これは単なる観察です。

This is a take-off on @Tim Pietzcker's method.
Although 'words' can be anything, if you want to require at least
3 words have [a-zA-Z0-9]{2,40} characters imbedded, you could do this.

^                      # 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

This should match at least 3 special [a-zA-Z0-9]{2,40} words separated by at least 1 space
including a digit and special character.

update

Yes, you can combine it into a single group done {3} times in 2 ways I know of.

Use a capture buffer as a flag

^(?=.*[@#$%^&+=])(?=.*\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

Or, by using a conditional

^(?=.*[@#$%^&+=])(?=.*\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 に答える