首页 文章

字符串至少包含一个数字

提问于
浏览
6

我试图查看字符串是否至少包含一个数字或小写或大写 .

我写过这样的话:

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 回答

  • 3

    您可以使用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

    这是我的尝试 . 注意,这使用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
    
  • 1

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

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

    Pattern javadoc应该有很大帮助 .

  • 12

    虽然使用正则表达式显然可行,但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
    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();
    }
    

相关问题