1

次の正規表現があります。

Regex pattern = new Regex(@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,20}/(.)$");

(?=.*\d)                //should contain at least one digit
(?=.*[a-z])             //should contain at least one lower case
(?=.*[A-Z])             //should contain at least one upper case
[a-zA-Z0-9]{8,20}       //should contain at least 8 characters and maximum of 20

私の問題は、3 つの連続する文字が同一であるかどうかも確認する必要があることです。検索すると、次の解決策が見つかりました。

/(.)\1\1/

ただし、既存の正規表現と組み合わせた場合、機能させることはできませんが、それでもうまくいきません:

Regex(@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,20}$/(.)\1\1/");

ここで何を見逃したのですか?ありがとう!

4

2 に答える 2

3

問題は、一部の言語 (Perl など) でリテラル正規表現を引用するために使用される/(.)\1\1/周囲の/文字が含まれていることです。ただし、引用符を使用しない場合でも、正規表現に追加することはできません。

正規表現の冒頭で、次のように、「次の文字には、その後に続く文字を含めることはできません」と言う必要があります(?!.*(.)\1\1)。は(?!ゼロ幅の負の先読みアサーションを開始します。「ゼロ幅」部分は、入力文字列内の文字を消費しないことを意味し、「負の先読みアサーション」は、指定されたパターンがどこにも現れないことを確認するために入力文字列を前方に見ることを意味します。

つまり、次のような正規表現が必要です。

new Regex(@"^(?!.*(.)\1\1)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,20}$")
于 2013-08-12T04:11:50.693 に答える
2

私は試行錯誤を使って解決しました:

Regex pattern = new Regex(@"^(?!.*(.)\1\1)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,20}$");
于 2013-08-12T04:11:36.960 に答える