Java 密码验证,一次一个正则表达式模式
对于password字段,我有一个TextWatcher,onTextChanged,我对文本运行四个regex模式中的每一个,每次一个。我的正则表达式模式是:Java 密码验证,一次一个正则表达式模式,java,regex,passwords,pattern-matching,Java,Regex,Passwords,Pattern Matching,对于password字段,我有一个TextWatcher,onTextChanged,我对文本运行四个regex模式中的每一个,每次一个。我的正则表达式模式是: ".{3,5}" "(?=.*[A-Z])" "(?=.*[a-z])" "(?=.*\\d)" 我编写了此测试代码,但不理解为什么会失败: Pattern pat = Pattern.compile("(?=.*[A-Z])"); Matcher mat = pat.matcher("aB"); if(m
".{3,5}"
"(?=.*[A-Z])"
"(?=.*[a-z])"
"(?=.*\\d)"
我编写了此测试代码,但不理解为什么会失败:
Pattern pat = Pattern.compile("(?=.*[A-Z])");
Matcher mat = pat.matcher("aB");
if(mat.matches()){
System.out.println("MATCHES!");
}
else{
System.out.println("DOES NOT MATCH");
}
我原以为这里会有比赛,但失败了。
类似地,其他正则表达式模式也会失败 使用look around(?=condition)
我们可以检查整个字符串上的许多条件,因为它的宽度为零(它会将光标在正则表达式引擎中的位置重置为look-ahead执行测试之前的位置)
所以,由于matches()
检查整个字符串是否匹配正则表达式,并环顾重置游标,这意味着游标无法传递整个字符串以接受该正则表达式
如果要使用matches()
可以像这样使用正则表达式
(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).{3,5}
{3,5}
部分将允许正则表达式引擎对3-5个字符进行迭代,因此,如果字符串较短或较长,则将不接受它(因为正则表达式无法匹配整个字符串)
此解决方案的替代方法是使用
find()
而不是matches()
。同样,在这种情况下,你不应该使用环顾四周。简单的[A-Z]
,[A-Z]
,\\d
和查找()。只有当我们希望正则表达式能够对数据进行多次迭代时,我们才使用环视机制 请编辑您的问题,明确说明您的行为和期望。(我假设您期望一个匹配,但没有得到一个,但我不应该猜测。)我需要能够分别将密码与每个正则表达式模式进行模式匹配。原因是,在我的UI中,我想在输入密码时显示每个规则的状态。@DIUser由于您对堆栈溢出比较陌生,您可能不熟悉接受应答机制。在这种情况下,考虑一下