Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 密码验证,一次一个正则表达式模式_Java_Regex_Passwords_Pattern Matching - Fatal编程技术网

Java 密码验证,一次一个正则表达式模式

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

对于password字段,我有一个TextWatcher,onTextChanged,我对文本运行四个regex模式中的每一个,每次一个。我的正则表达式模式是:

".{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由于您对堆栈溢出比较陌生,您可能不熟悉接受应答机制。在这种情况下,考虑一下