1

グーグルとSOで広範囲に検索した後、私は問題に遭遇しました。SOで見つけた正規表現に基づいて正規表現を書き込もうとしています

  1. 文字列は8〜24文字である必要があり、

  2. 文字列は、長さに加えて、次の2つの基準に(少なくとも)一致する必要があります。

    • 大文字
    • 小文字
    • 数値
    • 非英数字

これは私が変更しようとしている正規表現です:

^.*(?=.{8,24})(?=.*\d|\W)(?=.*[a-zA-Z]).*$

これを変更する必要があるのは、パスワードが上記の基準に一致することを確認するためです。

コードの一部がどのように機能するかについての他の基本事項が変わるため、プログラムでこれを実行することはできません。現在、正規表現チェックが行われているので、新しい式で構成ファイルを更新するだけです。

4

3 に答える 3

2

たぶん(空白を削除する)のようなものを試してみてください

^
(((?=.*[a-z])
  ((?=.*[A-Z])|(?=.*\d)|(?=.*\W))) |
 ((?=.*[A-Z])
  ((?=.*\d)|(?=.*\W))) | 
 ((?=.*\d)(?=.*\W)))
.{8,24}
$

これは次のように構成されています。

^<char restrictions><length restriction>$

どこ

char restriction = (<lower> and (<upper> or <numeric> or <non-alphanum>)) 
                  or (<upper> and (<numeric> or <non-alphanum>))
                  or (<numeric> and <non-alphanum>)

(これらはすべて先読みです。)

文字列の開始と終了の間に8〜24文字が必要であることを正規表現エンジンに通知する必要があるため、長さの制限は先読みではありません。.*(トップレベルのどこかに置くことで、この制限を行うことができなくなります。)


ただし、この恐ろしい正規表現を使用するのではなく、コードを変更するためにあらゆる努力を払う必要があります。

于 2012-11-12T21:30:00.350 に答える
1

いいえ、きれいではありませんが、そのような力ずくの力を使用して、単一の正規表現で効率的にそれを行うことができます(C#を想定):

4つのパスワード基準のうち2つに一致する正規表現:

Regex re = new Regex(@"
    # Match 2 of 4 passwords criteria and length from 8 to 24.
    ^                   # Anchor to start of string.
    (?:                 # Group acceptable pair alternatives.
      (?=[^A-Z]*[A-Z])  # At least one Upper Case.
      (?=[^a-z]*[a-z])  # At least one Lower Case.
    |                   # or...
      (?=[^A-Z]*[A-Z])  # At least one Upper Case.
      (?=[^0-9]*[0-9])  # At least one Numeric.
    |                   # or...
      (?=[^A-Z]*[A-Z])  # At least one Upper Case.
      (?=\w*\W)         # At least one Non-AlphaNumeric.
    |                   # or...
      (?=[^a-z]*[a-z])  # At least one Lower Case.
      (?=[^0-9]*[0-9])  # At least one Numeric.
    |                   # or...
      (?=[^a-z]*[a-z])  # At least one Lower Case.
      (?=\w*\W)         # At least one Non-AlphaNumeric.
    |                   # or...
      (?=[^0-9]*[0-9])  # At least one Numeric.
      (?=\w*\W)         # At least one Non-AlphaNumeric.
    )                   # Brute force!
    .{8,24}             # Match from 8 to 24 chars.
    \z                  # Anchor to end of string.
    ", RegexOptions.IgnorePatternWhitespace);
if (re.IsMatch(text)) {
    // Password is valid.
} else {
    // Password is NOT valid.
} 

4つの要件のうち2つには、6つの可能な組み合わせがあります。最後の.{8,24}長さチェックでは、改行以外の文字は問題ないことを前提としています(これを変更する必要がある場合があります)。

編集: dbauppの答え​​がうまく機能していることがわかりました(私はそれに賛成票を投じました)。大文字を見つけるための私の表現(?=[^A-Z]*[A-Z])は:よりも効率的ですが(?=.*[A-Z])(そして同じことが他の先読みにも当てはまります)。一方、dbauppの答え​​は、グループ化に関してより効率的です。

于 2012-11-13T02:28:41.317 に答える
0
def check_password_strength(x):
    ## Initialize the toggle flags to check 3 conditions - Capital Letter/Small Letter/Numeric Value
    flag_capital_letter = 0
    flag_small_letter = 0
    flag_numerical_letter = 0
    
    ## Message strings that will be displayed to the user
    strong_pass_msg = "Strong password"
    weak_pass_msg = "Weak Password"
    
    if len(x) >= 6 and len(x) <= 12 : ## Ensure the Length of Password between [6,12], both inclusive 
        if '#' in x or '$' in x or '@' in x : ## At least one Special Character Should be in password
            for i in x:  ## Loop for parsing the string to check for 3 remaining conditions
                if i.islower():
                    flag_small_letter = 1
                if i.isupper():
                    flag_capital_letter = 1
                if i.isnumeric():
                    flag_numerical_letter = 1
            ## if all three conditions are fulfilled, all flags toggle to 1
            if flag_numerical_letter == 1 and flag_capital_letter == 1 and flag_small_letter == 1:
                return(strong_pass_msg)
            else:
                return(weak_pass_msg)
        else:
            return(weak_pass_msg)
    else:
        return(weak_pass_msg)
    
username = input("Enter your Username: ")
password = input("Enter Password: ")
check_password_strength(password)
于 2021-06-30T20:26:45.440 に答える