字符串至少包含一个数字

时间:2011-06-21 01:04:01

标签: java regex

我正在尝试查看字符串是否至少包含数字或小写或大写。

我写过这样的话:

      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;
      }

然而,我不明白为什么我不能得到组合去36。他们只是保持在0.我做错了什么?

5 个答案:

答案 0 :(得分:12)

您可以使用Pattern,我认为“matches”方法会查找整个字符串以匹配正则表达式。

尝试下一个代码:

    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;
    }

答案 1 :(得分:4)

这是我的尝试。注意,这使用unicode类别进行验证,因此非拉丁语言友好。

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

答案 2 :(得分:3)

问题是matches尝试匹配整个输入字符串。

相反,尝试创建Pattern,然后从那里创建Matcher,然后使用find方法。

Pattern javadoc应该有很大帮助。

答案 3 :(得分: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 :(得分: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();
}