Android

时间:2016-10-24 22:40:41

标签: java android regex

我的密码规则需要满足以下条件:

以下至少2项: - 至少1个小写字符 - 至少1个大写字符 - 至少2个(数字和特殊字符)

我在下面构建我的正则表达式:

String oneLowercaseCharacter = ".*[a-z].*";
String oneUppercaseCharacter = ".*[A-Z].*";
String oneNumber = ".*\\d.*";
String oneSpecialCharacter = ".*[^\\`\\~\\<\\,\\>\\\"\\'\\}\\{\\]\\[\\|\\)\\(\\;\\&\\*\\$\\%\\#\\@\\!\\:\\.\\/\\?\\\\\\+\\=\\-\\_\\ ].*";
String threeNumbersAndCharacters = ".*[0-9\\^\\`\\~\\<\\,\\>\\\"\\'\\}\\{\\]\\[\\|\\)\\(\\;\\&\\*\\$\\%\\#\\@\\!\\:\\.\\/\\?\\\\\\+\\=\\-\\_\\ ].*[0-9\\^\\`\\~\\<\\,\\>\\\"\\'\\}\\{\\]\\[\\|\\)\\(\\;\\&\\*\\$\\%\\#\\@\\!\\:\\.\\/\\?\\\\\\+\\=\\-\\_\\ ].*[0-9\\^\\`\\~\\<\\,\\>\\\"\\'\\}\\{\\]\\[\\|\\)\\(\\;\\&\\*\\$\\%\\#\\@\\!\\:\\.\\/\\?\\\\\\+\\=\\-\\_\\ ].*";

然后我构建如下所示的函数:

if ((Pattern.compile(oneLowercaseCharacter).matcher(s).find() && Pattern.compile(oneUppercaseCharacter).matcher(s).find())
                            || (Pattern.compile(oneLowercaseCharacter).matcher(s).find()
                                && Pattern.compile(oneSpecialCharacter).matcher(s).find()
                                && Pattern.compile(oneNumber).matcher(s).find()
                                && Pattern.compile(threeNumbersAndCharacters).matcher(s).find())
                            || (Pattern.compile(oneUppercaseCharacter).matcher(s).find()
                                && Pattern.compile(oneSpecialCharacter).matcher(s).find()
                                && Pattern.compile(oneNumber).matcher(s).find()
                                && Pattern.compile(threeNumbersAndCharacters).matcher(s).find())) {
//Do my stuff here
}

但是,它没有按预期工作。不确定为什么,但如果我使用不同的密码测试,结果显示如下:

qwerty123是真的(不是预期的)

qwerty!@#false

qwerty12。真

Qwerty123 true

Qwerty12。真

任何人都知道我错过了哪里?

注意:我已经搜索了stackoverflow并已经在其他地方查找,以便我想出上面的代码,但无法进一步。

1 个答案:

答案 0 :(得分:1)

问题出在这一行:

String oneSpecialCharacter = ".*[^\\`\\~\\<\\,\\>\\\"\\'\\}\\{\\]\\[\\|\\)\\(\\;\\&\\*\\$\\%\\#\\@\\!\\:\\.\\/\\?\\\\\\+\\=\\-\\_\\ ].*";

^内的第一个位置使用时,[]字符具有特殊含义(&#34;不是&#34;)。

这就是你需要逃避的原因。

String oneSpecialCharacter = ".*[\\^\\`\\~\\<\\,\\>\\\"\\'\\}\\{\\]\\[\\|\\)\\(\\;\\&\\*\\$\\%\\#\\@\\!\\:\\.\\/\\?\\\\\\+\\=\\-\\_\\ ].*";

现在你的结果应该是这样的:

qwerty123 -> false
qwerty!@# -> false 
qwerty12. -> true
Qwerty123 -> true
Qwerty12. -> true

强调^的含义的其他例子:

// the first character cannot be a
System.out.println(Pattern.compile("[^a]bc").matcher("abc").find());        // false

// the first character cannot be x, y or z, but it can be a
System.out.println(Pattern.compile("[^xyz]bc").matcher("abc").find());      // true

// the first character can be ^ or a
System.out.println(Pattern.compile("[\\^a]bc").matcher("abc").find());      // true

// the first character can be ^, x, y or z, but not a
System.out.println(Pattern.compile("[\\^xyz]bc").matcher("abc").find());    // false