2012-05-11 13 views
0

私は次の正規表現を使用しています。 (?=。+ [az])(?=。+ [AZ])(?=。+ [^ a-zA-Z]){8、}正規表現が意図したとおりに動作しない

私の目標は、全ての3

以下の入力とI式をテストする http://rubular.com/r/i26nwsTcaUhttp://regexlib.com/RETester.aspxを使用してい

大文字、小文字、数字、特殊文字

以下の4つの特性の

[email protected] 
password1P 
Password1 
paSSw0rd 

を有しますこれらは通過しなければならないが、第2および第4のものだけがhttp://rubular.com/r/i26nwsTcaUとなり、すべてがhttp://regexlib.com/RETester.aspxになります。

また、私はこのコードを渡す必要があります「Password1という」を検証するために失敗した

private void doValidate(String inputStr,String regex) { 
    Pattern pattern = Pattern.compile(regex); 
    if(!pattern.matcher(inputStr).matches()){ 
     String errMessage = ""; 
     throw new UniquenessConstraintViolatedException(errMessage); 
    } 
} 

を検証するために使用しています次のコードを持っています。 は限り表現が行くように私は、誰もが、それは私が間違ってやっているものを私に伝えることができ、この

must have lower (?=.+[a-z]) 
must have upper (?=.+[A-Z]) 
must have non alpha (?=.+[^a-zA-Z]) 
must be eight characters long .{8,} 

ようにそれを理解しています。

ありがとうございます。

+0

http://xkcd.com/936/ – FlyingStreudel

+0

@Vulcanが、またはそれはそれらのすべてに一致します意味します。 – Cfreak

+0

問題は、最初の大文字が無視されていることです。文字列の他の場所に資本を追加すると、パスワード1と3で正常に動作します。 – Vulcan

答えて

1

基本的に、.+部分式が非難している、彼らは.*をする必要があります。それ以外の場合、先読み部分は小文字、大文字または非アルファを検索しますが、対応する各タイプの文字は文字列の最初の文字である場合はカウントされません。したがって、パスワードではなく、最初の文字が切り捨てられたパスワードを検証しています。 @Cfreakは正しいのではありませんが、彼は近づいています。あなたがやっていることは正規正規表現では不可能で、あなたが提案したものを使う必要があります。 lookaheadグループの場合 - (?=) - 必要な処理を行うことができます。それでも、個人的には、@Cfreakが示唆しているようにコードを作成したいと思います。コードはより読みやすく、意図が明確です。複雑な正規表現は書き込みが難しい傾向がありますが、しばらくして読み込み、デバッグ、または改善することは不可能に近くなりがちです。

+0

あなたの素早い返信のおかげで皆に感謝します。 。*は私の問題を解決しました。その理由は、パスワードのルールを外部化するために正規表現を使用しているため、後でアプリケーションの再デプロイメントなしに変更できるからです。すべての返信をありがとう。 – peekay

0

あなたの正規表現では、小文字が1つ以上、大文字が1つ以上、大文字または小文字が1つ、その後に8文字以上必要であると表示されます。

特定の文字がどこに表示されるかを指定しない限り、正規表現ではANDはできません。あなたは基本的に正規表現の各部分をそれ自身の正規表現に分割し、それぞれの部分をチェックする必要があります。あなたはどのような文字列長のメソッドJavaで(私はそれが私の頭から何かを知らないので、私はjavaデベロッパーではない)申し訳ありませんが長さを確認することができます。

擬似コード:

if(regexForLower && regexForUpper && regexForSpecial && string.length == 8) { 
    // pass 
} 
+0

である必要はありません。私は最初のものをすべて受け入れるパターンがありますが、それは@記号のためです。 – Vulcan

0

私がコメントで言ったように、位置0大文字は無視されています。

ここに4つのパスワードがすべて一致する正規表現があります。

(?=.+\\d)(?=.+[a-z])(?=\\w*[A-Z]).{8,} 
0

私はそのような正規表現を使用しません。

  • あなたが何であるかをクライアントに伝えたい場合は、その結果

で多くを行うことはできません

  • を拡張するために
  • ハードをデバッグする
  • ハードを理解することは困難ですパスワードが間違っている場合は、再度パスワードを調査してください。実際の環境では、外国のロケールの文字をサポートすることができます。

    import java.util.*; 
    /** 
        Pwtest 
    
        @author Stefan Wagner 
        @date Fr 11. Mai 20:55:38 CEST 2012 
    */ 
    public class Pwtest 
    { 
    
        public int boolcount (boolean [] arr) { 
         int sum = 0; 
         for (boolean b : arr) 
          if (b) 
           ++sum; 
         return sum; 
        } 
    
        public boolean [] rulesMatch (String [] groups, String password) { 
         int idx = 0; 
         boolean [] matches = new boolean [groups.length]; 
         for (String g: groups) { 
          matches[idx] = (password.matches (".*" + g + ".*")); 
          ++idx; 
         } 
         return matches;  
        } 
    
        public Pwtest() 
        { 
         String [] groups = new String [] {"[a-z]", "[A-Z]", "[0-9]", "[^a-zA-Z0-9]"}; 
         String [] pwl = new String [] {"[email protected]", "password1P", "Password1", "paSSw0rd", "onlylower", "ONLYUPPER", "1234", ",:?!"}; 
         List <boolean[]> lii = new ArrayList <boolean[]>(); 
         for (String password: pwl) { 
          lii.add (rulesMatch (groups, password)); 
         } 
    
         for (int i = 0 ; i < lii.size(); ++i) { 
          boolean [] matches = lii.get (i); 
          String pw = pwl[i]; 
          if (boolcount (matches) < 3) { 
           System.out.print ("Password:\t" + pw + " violates rule (s): "); 
           int idx = 0; 
           for (boolean b: matches) { 
            if (! b) 
             System.out.print (groups[idx] + " "); 
            ++idx; 
           } 
           System.out.println(); 
          } 
          else System.out.println ("Password:\t" + pw + " fine "); 
         } 
        } 
    
        public static void main (String args[]) 
        { 
         new Pwtest(); 
        } 
    } 
    

    出力:

    Password: [email protected] fine 
    Password: password1P fine 
    Password: Password1 fine 
    Password: paSSw0rd fine 
    Password: onlylower violates rule (s): [A-Z] [0-9] [^a-zA-Z0-9] 
    Password: ONLYUPPER violates rule (s): [a-z] [0-9] [^a-zA-Z0-9] 
    Password: 1234 violates rule (s): [a-z] [A-Z] [^a-zA-Z0-9] 
    Password: ,:?! violates rule (s): [a-z] [A-Z] [0-9] 
    Password: Übergrößen345 fine 
    Password: 345ÄÜö violates rule (s): [a-z] [A-Z] 
    
  • 関連する問題