-3

こんにちは、私は正規表現に慣れていないので、入力の次のケースを避けたいと思いました

1111 - not allowed
aaaa - not allowed
abcd - not allowed
1234 - not allowed

文字列のサイズは4文字でなければなりませ ん。上記の場合に正規表現を書く方法を教えてください。

編集:

これが私がjqueryで行うことです

if(NewPasscode.match('^(?!1111|aaaa|abcd|1234).{4}$')) {
    alert('Not Ok');
    return false;
} else {
   alert('Ok');
}
4

4 に答える 4

3

否定先読みアサーションを使用できます。

^(?!1111|aaaa|abcd|1234).{4}$

これは、、、、またはを除く 4 文字で構成される任意の文字列と一致します。1111aaaaabcd1234

ただし、テストを逆にするだけの方が簡単な場合があります。

1111|aaaa|abcd|1234

これは、、、、またはと一致1111します。入力文字列の長さを確認し、このパターンに一致する場合は拒否できます。aaaaabcd1234

さらに言えば、これらの許可されていない文字列を、選択した言語でリスト/配列/などに保存できます。文字列の長さと、許可されていない入力のリストに含まれているかどうかを確認するだけです。拒否する必要があるパターンがさらに多くある場合、これはよりクリーンな方法です。


アップデート

JavaScript を使用しているように見えるため、正規表現リテラルを指定する必要があることに注意してください。

if(NewPasscode.match(/^(?!1111|aaaa|abcd|1234).{4}$/)) {
    alert('Ok');
    return false;
} else {
   alert('NOT Ok');
}

ただし、一致をテストするだけの場合は、次のtest方法を使用できます。

if(/^(?!1111|aaaa|abcd|1234).{4}$/.test(NewPasscode)) {
    alert('Ok');
    return false;
} else {
   alert('NOT Ok');
}

私の2番目の提案を使用するには:

if(NewPasscode.length == 4 && !/1111|aaaa|abcd|1234/.test(NewPasscode)) {
    alert('Ok');
    return false;
} else {
   alert('NOT Ok');
}

私の3番目の提案を使用するには:

var disallowed = ['1111','aaaa','abcd','1234'];
if(NewPasscode.length == 4 && disallowed.indexOf(NewPasscode) == -1) {
    alert('Ok');
    return false;
} else {
   alert('NOT Ok');
}
于 2013-09-24T14:10:15.760 に答える
2

一般的に同じ文字を 4 回許可しない場合は、次のようにします。

^(?!(.)\1{3}|1234|abcd).{4}$

こちらの Regexrを参照してください。

(.)\1{3}任意の文字(.)に一致し、キャプチャ グループに格納されます。\1{3}次に、この文字がさらに 3 回繰り返されるかどうかを確認します。

「1234」のようなシーケンスの場合、正規表現は文字の意味を知らないため、明示的にリストする以外に方法はありません。文字が同じかどうかは確認できますが、ある文字が別の文字と特定の関係にあるかどうかは確認できません。

于 2013-09-24T14:24:14.280 に答える
1

4つの特徴的な可能性だけが必要ではないと仮定します:

function isValidPassword(password){
  var consecutive = 1,
      lastChar = -1, o = -1;
  for (var i = 0; i < password.length; i++){
    o = password.charCodeAt(i);
    if (lastChar != -1 && (o == lastChar || o == lastChar + 1)){
      consecutive++;
    }else{
      consecutive = 1;
    }
    lastChar = o;
    if (consecutive == 4) return false;
  }
  return true;
};

上記により、次のことが防止されます。

  • 文字列内で見つかった4 つの繰り返し文字。
    例: aaaa、bbbb、0000、 xxxx。aaab、 bbba、0111、xxyz は除く
  • 文字列で見つかった4 つの連続する文字。
    例: abcd、ghij、1234、6789 ですが、* abbcd、ghik、1245、または 7890 ではありません

それはあなたに与えるでしょう:

Password:  Valid?:
1111       False
aaaa       False
abcd       False
1234       False
foo        True
bar        True
baz        True
password   True
1112       False
aaab       False
ghij       False
1357890    True
于 2013-09-24T14:35:14.183 に答える
0

これはあなたのニーズに合うはずです:

^(?!1111|aaaa|abcd|1234)[a-z0-9]{4}$

正規表現の視覚化

Debuggex デモ

于 2013-09-24T14:10:04.000 に答える