0

文字の繰り返しを防ぐことに関するスタックオーバーフローの回答をたくさん読んだことがありますが、これらはすべて、正規表現文字列が次のように1行にある場合です。

^(?=.{4})(?!.{32})(?!.*(.)\1{4})\w[\w.-]+\w$

私はパスワードの検証にこの概念を使用していますhttp://www.webdesignerdepot.com/2012/01/password-strength-verification-with-jquery/つまり、有効なクラスをリスト項目に追加するたびに検証ルールが渡されます。次のように、パスワード フィールドの上に手順のリストがあります。

<ul>
  <li id="letter" class="invalid">At least <strong>3 letters</strong></li>
  <li id="number" class="invalid">At least <strong>2 numbers</strong></li>
</ul>

<input type="password" id="input-password" name="password" autocomplete="off">

ユーザーの入力がこれを満たす場合、命令の横にチェックマークが付きます。

ので、私は持っています:

var pwd = $(this).val();

if ( pwd.match(/[A-z]{3,}/) ) {
        $('#letter').removeClass('invalid').addClass('valid');
    } else {
        $('#letter').removeClass('valid').addClass('invalid');
    }
if ( pwd.match(/\d{2,}/) ) {
        $('#number').removeClass('invalid').addClass('valid');
    } else {
        $('#number').removeClass('valid').addClass('invalid');
    }

{3,} が機能することを期待していましたが、この例では、3 文字が連続しているかどうかのみを検証し、完全な文字列のどこかに出現するかどうかは検証しません。たとえば、「a1aa」は無効ですが、「aaa」は有効です。私はたくさん読んだことがありますが、正規表現がこのように分割された他の例を見つけることができないため、この状況で何が必要なのか理解できません。

何か助けはありますか?

編集

申し訳ありませんが、nhahtdh が指摘したように、タイトルは質問に関連して意味がありません! 実際には、パスワードが同じ文字を 3 回以上繰り返してはならないという追加の検証要件があります。たとえば、'mississippi' は、文字 's' のインスタンスが 3 つ以上あるため、有効ではありません。

4

2 に答える 2

2

文字列を少なくとも 3 文字と一致させるには、A-Z a-z次を使用できます

pwd.match( /(?:[^a-z]*[a-z]){3,}/i ) 

i、大文字と小文字を区別しない修飾子です。

正規表現は、 以外の 0 個以上の文字に一致A-Za-zし、その後に文字A-Za-zが 3 回以上続きます。

?:オプションであり、グループを()非キャプチャにします。

ちなみに、実際にマッチを使用していない場合testよりも、使用した方が効率的です。match

if ( /([^a-z]*[a-z]){3,}/i.test(pwd) ) {

さらにコメントへ

追加の検証要件を満たすために、使用できる

/^(?:[^a-z]*([a-z])(?!(?:.*?\1){3})){3,}[^a-z]*$/i

少なくとも 3 文字の文字列にのみ一致し、負の先読み(?!と後方参照\1を使用して、同じ文字 (大文字と小文字を区別しない) が 3 回以上表示されないようにします。

または、たとえば"abcccC"4 番目Cが大文字で問題ない場合は、代わりに使用できます

/^(?:[^A-Za-z]*([A-Za-z])(?!(?:.*?\1){3})){3,}[^A-Za-z]*$/
于 2013-05-01T08:10:30.373 に答える
1

どうですか

if ( pwd.match(/[a-zA-Z]/g).length >= 3 ) {
于 2013-05-01T07:27:27.393 に答える