-1

自分の考えを確認し、コミュニティと共有したい..

Active Directory パスワードの正規表現は、パスワードが

  1. 長さは 6 文字以上です
  2. 英大文字 (A から Z) を含む
  3. 英語の小文字 (a から z) を含む
  4. 基数 10 の数字 (0 から 9) を含む
  5. アルファベット以外の文字を含む (!、$、#、% ...)
  6. ユーザーのアカウント名またはユーザーのフルネームの一部が連続する 2 文字を超えていないこと

最初の 5 つの条件は単純です。

これは1〜5の条件で機能するはずであることがわかりました:

(?=^.{8,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*

しかし、条件 6 (名前とログインの否定) を追加するにはどうすればよいでしょうか?

私はそれを次のように見ています。

最初に禁止されているものを取得します。

String enter = fullname + login;

List<string> Negative = new List<string>();

for (int i = 0; i < enter.Length; i += 3)
{
    if (i + 3 > enter.Length)
    {
        enter.Substring(i, 3);
        Negative.Add(enter.Substring(i, 3));
    }

}

次に、正規表現を構築します。

StringBuilder pattern = new StringBuilder("(?=^.{8,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))");

foreach(string word in Negative)
{
    pattern.Append("(/^((?!" + word + @")[\s\S])*$/)");
}

pattern.Append("^.*");

パターンは必要な正規表現になっているはずです。

私の主な関心事は、次のコード行です。

pattern.Append("(/^((?!" + word + @")[\s\S])*$/)");

の負の条件を追加しwordますか?

4

2 に答える 2

2

正規表現は優れたツールですが、すべてを解決できるわけではありません。たとえば、正規表現は、必要な意味でカウントできません。はい、正規表現は、たとえば連続した文字をカウントできますが、たとえば、これらのうちの 2 つと他の 3 つが完全な入力文字列に広がっていることを確認することはできません。これは、特定の質問にも当てはまります。具体的には、同じ正規表現でこれら 2 つの異なる条件をチェックすることは、非常に困難になる場合があります。

この場合、正規表現を使用せず、すべてのチェックを実行する小さなアルゴリズムを作成することをお勧めします。このアプローチで得られるもう 1 つの利点は、単なる人間が後で再訪したときにアルゴリズムを理解できることです。常に追加の利点。

于 2013-06-26T04:51:42.023 に答える
0

5番目と1番目の要件は、この正規表現になります

^.{6,}$

6番目の要件については、

アカウント名がaccountName

inputターゲットの入力パスワードです

bool isNotValid= Regex.Matches(accountName,"(?=(..))")//capturing two consecutive characters of account name
                      .Cast<Match>()
                      .Select(m=>m.Groups[1].Value)//two consecutive character's list
                      .Any(y=>input.IndexOf(y)!=-1);

連続する 2 文字をキャプチャすることは、2 つ以上の連続する文字をキャプチャすることと同じです

以前は(?=(..))2 つの連続する文字をキャプチャしていました。これは、hello からhe, el,をキャプチャします。lllo

于 2013-06-26T04:59:45.453 に答える