5

C# と .NET を使用してユーザー登録フォームを作成しています。ユーザーが入力したパスワード フィールドを検証する必要があります。検証要件は以下の通りです。

  1. 英数字 (az 、AZ 、0-9) である必要があります。
  2. 6 ~ 10 文字 (最小 6 文字、最大 10 文字) を受け入れる必要があります。
  3. 少なくとも 1 つのアルファベットと数字 (例: stack1over)

以下のような正規表現を使用しています。

^([a-zA-Z0-9]{6,10})$

最初の 2 つの条件を満たしています。文字や数字だけを入力すると失敗します。

4

3 に答える 3

9

可能であれば、複数の正規表現を介して渡します。それらの先読みの怪物よりもずっときれいになります:-)

^[a-zA-Z0-9]{6,10}$
[a-zA-Z]
[0-9]

賢いと考える人もいるかもしれませんが、単一の正規表現ですべてを行う必要はありません (場合によっては、正規表現で 75 から 4093 までの数字を検出するために正規表現が必要な人を目撃してください)。

次のようなきれいなコードが表示されますか?

if not checkRegex(str,"^[0-9]+$")
    return false
val = string_to_int(str);
return (val >= 75) and (val <= 4093)

または次のようなもの:

return checkRegex(str,"^7[5-9]$|^[89][0-9]$|^[1-9][0-9][0-9]$|^[1-3][0-9][0-9][0-9]$|^40[0-8][0-9]$|^409[0-3]$")

どちらを維持したいかはわかっています:-)

于 2010-02-03T08:22:11.837 に答える
7

肯定的な先読みを使用する

^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]{6,10}$

ルックアラウンドはゼロ幅アサーションとも呼ばれます。これらは、行頭と行末 ( ^, $) のようにゼロ幅です。違いは、ルックアラウンドは実際には文字と一致しますが、一致をあきらめて、一致するか一致しないかという結果のみを返すことです。そのため、それらは「アサーション」と呼ばれます。それらは文字列内の文字を消費しませんが、一致が可能かどうかをアサートするだけです。

ルックアラウンドの構文:

  • (?=REGEX)前向きな先読み
  • (?!REGEX)否定先読み
  • (?<=REGEX)肯定的な後読み
  • (?<!REGEX)否定後読み
于 2010-02-03T07:42:31.133 に答える
0
string r = @"^(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]{6,10}$";
Regex x = new Regex(r);
var z = x.IsMatch(password);

http://www.regular-expressions.info/refadv.html

http://www.regular-expressions.info/lookaround.html

于 2013-12-05T14:35:29.303 に答える