2011-06-21 48 views
4

文字列に少なくとも1桁の数字、小文字または大文字が含まれているかどうかを確認しようとしています。私は間違って何をやっている文字列に少なくとも1桁が含まれています

私は組み合わせは彼らがちょうど0のまま36に行くために得ることができない理由を私は理解していないが
 int combinations = 0; 
     string pass = "!!!AAabas1"; 

     if (pass.matches("[0-9]")) { 
      combinations = combinations + 10; 
     } 

     if (pass.matches("[a-z]")) { 
      combinations =combinations + 26; 
     } 

     if (pass.matches("[A-Z]")) { 
      combinations =combinations + 26; 
     } 

私はこのような何かを書かれていますか?

+0

は、国際的なユーザーにいくつかの愛を与える - 勝利のためにUTF8を!また、句読点やその他の特殊文字を使用している人は、余分なクレジットを取得する必要があります。 –

+0

@Seth Robertson:私はJavaの内部表現がUTF-16であると思っていました... – phooji

+0

@phooji:しかし、彼はスペースを含まない0-9A-Za-zのクレジットを与えているだけです:/ - @ [-' { 〜〜と完全なUTF-8キャラクタセット。 –

答えて

10

代わりに「パターン」を使用できます。「一致」メソッドは、文字列全体が正規表現に一致するかどうかを調べます。

次のコードを試してみてください。このために正規表現を使用している間

int combinations = 0; 
    String pass = "!!AAabas1"; 
    if (Pattern.compile("[0-9]").matcher(pass).find()) { 
     combinations = combinations + 10; 
    } 

    if (Pattern.compile("[a-z]").matcher(pass).find()) { 
     combinations = combinations + 26; 
    } 

    if (Pattern.compile("[A-Z]").matcher(pass).find()) { 
     combinations = combinations + 26; 
    } 
+0

コード例のHrzioありがとうございます。本当に役に立ちました。それを解決した。 – idipous

2

問題は、matchesが入力文字列全体を照合しようとしていることです。

代わりにPatternを作成し、そこからMatcherを作成してから、findメソッドを使用してください。

Pattern javadocは大いに役立ちます。

1

は明らかに作業することができ、GuavaCharMatcherクラスは、もう少し適切なあなたが何をしようとしてのかもしれません:

if (CharMatcher.inRange('0', '9').matchesAnyOf(pass)) 
    combinations += 10; 
if (CharMatcher.inRange('a', 'z').matchesAnyOf(pass)) 
    combinations += 26; 
if (CharMatcher.inRange('A', 'Z').matchesAnyOf(pass)) 
    combinations += 26; 
4

これは私の試みです。注意してください。これは検証にユニコードカテゴリを使用しているため、ラテン語以外の言語には対応していません。ここで

import java.util.regex.Pattern; 

public class PasswordValidator { 

    public static void main(String[] args) { 
     final PasswordValidator passwordValidator = new PasswordValidator(); 
     for (String password : new String[] { "abc", "abc123", "ABC123", "abc123ABC", "!!!AAabas1", "гшщз", 
       "гшщзЧСМИ22" }) { 
      System.out.printf("Password '%s' is %s%n", password, passwordValidator.isValidPassword(password) ? "ok" 
        : "INVALID"); 
     } 
    } 
    private static final Pattern LOWER_CASE = Pattern.compile("\\p{Lu}"); 
    private static final Pattern UPPER_CASE = Pattern.compile("\\p{Ll}"); 
    private static final Pattern DECIMAL_DIGIT = Pattern.compile("\\p{Nd}"); 

    /** 
    * Determine if a password is valid. 
    * 
    * <p> 
    * A password is considered valid if it contains: 
    * <ul> 
    * <li>At least one lower-case letter</li> 
    * <li>At least one upper-case letter</li> 
    * <li>At least one digit</li> 
    * </p> 
    * 
    * @param password 
    *   password to validate 
    * @return True if the password is considered valid, otherwise false 
    */ 
    public boolean isValidPassword(final String password) { 
     return containsDigit(password) && containsLowerCase(password) && containsUpperCase(password); 
    } 

    private boolean containsDigit(final String str) { 
     return DECIMAL_DIGIT.matcher(str).find(); 
    } 

    private boolean containsUpperCase(final String str) { 
     return UPPER_CASE.matcher(str).find(); 
    } 

    private boolean containsLowerCase(final String str) { 
     return LOWER_CASE.matcher(str).find(); 
    } 

} 

は出力です:

Password 'abc' is INVALID 
Password 'abc123' is INVALID 
Password 'ABC123' is INVALID 
Password 'abc123ABC' is ok 
Password '!!!AAabas1' is ok 
Password 'гшщз' is INVALID 
Password 'гшщзЧСМИ22' is ok 
+0

ありがとうございます。ユニコード入力にうってつけ。実際には非常に役立つかもしれません! – idipous

1
String str_rno = "CooL8"; 

boolean Flag = false; 

String[] parts = str_rno.split(""); 

for (int i = 0; i < str_rno.length(); i++) { 

    String part1 = parts[i + 1];  

    if (Character.isDigit(str_rno.charAt(i))) { 
     System.out.println(" " + i + " " + part1 + " digit"); 
     Flag = true; 
    } else { 
     System.out.println(" " + i + " " + part1 + " char "); 
    } 

} 


if(Flag==true){ 
    Toast.makeText(getApplicationContext(),"String contain 1 digit",Toast.LENGTH_SHORT).show(); 
} 

if(Flag==flase){ 
    Toast.makeText(getApplicationContext(),"String not contain 1 digit",Toast.LENGTH_SHORT).show(); 
} 
関連する問題