2

文字列を指定すると、次のものが必要です。

  1. たった一つの数字
  2. (@#$*) の特殊文字は 1 つだけ
  3. 小文字6文字

文字列は上記の条件を任意に組み合わせることができ、長さは 8 にする必要があります。

例:

  1. 2@qwerty
  2. 1asddfg

  3. qwe*yt2u
  4. qw2wqia

これまでの私の正規表現は次のとおりです。

!/^(?=.*[0-9])(?=.*[^a-z])(?=.*[a-z])(?=.*[@#$*])\S{8,}$/.test(string)

上記の場合は機能しますが、次のような場合は機能しません。

  1. 2@2クワート
  2. 2@@qwert

私は何が欠けていますか?

4

5 に答える 5

2

さて、私はあなたが望むことをする正規表現を思いつきましたが、見た目が気に入らないかもしれませんが、その背後にある原則は単純です:

^(?=^.{8}$)(?=\D*[0-9])(?=[^@#$*]*[@#$*])(?=([^a-z]*[a-z]){6})\S{8}$

この式は、最初に 8 文字だけであることを確認します(?=^.{8}$)

ここで、式は単一の数値が(?=\D*[0-9])存在しないかどうかをチェックし、次に特殊な記号が 1 つ存在することを確認します(?=[^@#$*]*[@#$*])

この式により、小文字が 6 文字あることが保証されます(?=([^a-z]*[a-z]){6})

したがって、数字が 1 つ、特殊記号が 1 つ、小文字が 6 つあることが保証されています。合計は 8 文字なので、文字列は有効です。

もちろん、この操作を複数のステップに分割する必要があるため、これは最善の方法ではありませんが、楽しみのために単一の式で試してみたかったので、問題が見つかった場合はお知らせください.

于 2013-08-27T21:24:29.530 に答える
2

説明

次の理由により、式が壊れます。

^(?=.*[0-9])(?=.*[^a-z])(?=.*[a-z])(?=.*[@#$*])\S{8,}$
            ^^^^^^^^^^^^                       ^^^^^^
  • [^a-z]は否定された文字クラスであるため、これは ではないものすべてに一致しa-zます。式のこの部分の目的が何だったのかわかりません。
  • \S空白以外の文字と一致します。これにより、文字、数字、Unicode 文字、改行文字、任意の記号などを使用できます。
  • {8,}は、先行する文字を 8 つ以上使用できるようにします。これにより、文字列を無限の長さにすることができます。投稿では、文字列を最大 8 文字にする必要がありました。
  • #また、ベストプラクティスとして、これは正規表現の一部のバージョンでコメント文字として使用できるため、常にエスケープする必要がありxます。これにより、オプションが使用された場合に備えて式が準備されます。

私はあなたの表現を次のように修正します:

  • 文字列に 1 つの数字が含まれている必要があります
  • 文字列に 1 つの@#$*記号を含める必要がある
  • 文字列に 6 つの小文字を含める必要がありますa-z(大文字と小文字を区別しないオプションを使用しないでください)。
  • 文字列全体の長さが 8 文字である必要があります

^(?=.*?[0-9])(?=.*?[@\#$*])(?=(?:.*?[a-z]){6}).{8}$

ライブデモ

ここに画像の説明を入力

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    .*?                      any character except \n (0 or more times
                             (matching the least amount possible))
--------------------------------------------------------------------------------
    [0-9]                    any character of: '0' to '9'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    .*?                      any character except \n (0 or more times
                             (matching the least amount possible))
--------------------------------------------------------------------------------
    [@\#$*]                  any character of: '@', '\#', '$', '*'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (6 times):
--------------------------------------------------------------------------------
      .*?                      any character except \n (0 or more
                               times (matching the least amount
                               possible))
--------------------------------------------------------------------------------
      [a-z]                    any character of: 'a' to 'z'
--------------------------------------------------------------------------------
    ){6}                     end of grouping
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  .{8}                     any character except \n (8 times)
--------------------------------------------------------------------------------
  $                        before an optional \n, and the end of the
                           string
于 2013-08-28T03:28:59.340 に答える