字符串至少包含一个数字

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

我写过这样的话:

int combinations = 0; string pass = "!!!AAabas1"; if (pass.matches("[0-9]")) { combinations = combinations + 10; } if (pass.matches("[az]")) { combinations =combinations + 26; } if (pass.matches("[AZ]")) { combinations =combinations + 26; } 

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

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

尝试下一个代码:

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

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

 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. * * 

* A password is considered valid if it contains: *

    *
  • At least one lower-case letter
  • *
  • At least one upper-case letter
  • *
  • At least one digit
  • *

* * @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 

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

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

模式javadoc应该有很大帮助。

虽然使用正则表达式显然可以正常工作,但是Guava的CharMatcher类可能更适合您要做的事情:

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