2012-01-15 15 views
1

複雑なRegExを作成するのは本当にうまくいきません。私は、アプリのパスワード限界幾分強制するために、別のソースから次のコピー:RegEx文字の長さの制限がユニットテストで失敗する

// 8 to 20 char, one digit, one letter 
public static final String GOOD_PASSWORD_REGEX = 
    "(^(?=.{8,20})(?=.*[a-zA-Z])(?=.*[\\d]).*$)"; 

。一方、このユニットテストが失敗した:

String tooLongPassword = "asdfghjkl123456789qwe"; // 21 characters 
assertFalse(tooLongPassword.matches(ValidationContants.GOOD_PASSWORD_REGEX)); 

これは、類似の一握りの一つでありますテストケース私はこのRegExに対して、手紙や数字などを持たない他のものを含めて走っています。残りはすべて通過します。

ここでエラーがありますか?

答えて

1

バージョンでは、lookaheadアサーションは、文字列の先頭に8〜20文字の文字列が一致するかどうかを確認するだけです。これはもちろん、長さ21以上の文字列でも成功します。

// 8 to 20 char, one digit, one letter 
public static final String GOOD_PASSWORD_REGEX = 
    "(^(?=.{8,20}$)(?=.*[a-zA-Z])(?=.*\\d).*$)"; 

しかし、なぜパスワードに長さの最大値を課す:

だから$は、先読みの一部になるために必要ですか? \dショートカットの周りの[]も不要です。あなただけのパスワードを検証するための正規表現を必要とするので、(それが今でセットアップされた方法は、それが全体の入力文字列を返しますので)

さらに、実際にそれを返さない、あなたはに正規表現を短縮することができます。

"^(?=.{8,20}$)(?=.*[a-zA-Z])(?=.*\\d)"