Java正则表达式意外匹配

Gli*_*ide 2 java regex

为什么以下返回true?

Pattern.compile("(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.{8,12})").matcher("passworD12345678").find();
Run Code Online (Sandbox Code Playgroud)

它不应该(?=.{8,12})因为它的长度超出范围而失败吗?

Psh*_*emo 11

find()不检查整个字符串是否可以由正则表达式匹配matches().find只是试图找到可以由正则表达式匹配的任何子字符串.同时(?=.{8,12})检查后面是否有8到12个字符的地方.因此,要么在正则表达式中添加锚点 ^ $,表示字符串的开头和结尾

Pattern.compile("^(?=.*[A-Z])"
                + "(?=.*[a-z])"
                + "(?=.*[0-9])"
                + "(?=.{8,12}$)").matcher("passworD12345678").find();
Run Code Online (Sandbox Code Playgroud)

或使用matches()此正则表达式

Pattern.compile("(?=.*[A-Z])"
                + "(?=.*[a-z])"
                + "(?=.*[0-9])"
                + ".{8,12}").matcher("passworD12345678").matches();
//                 ^^^^^^^ we can't use look-ahead because we need some part of regex 
//                         which will let regex consume all characters from string
Run Code Online (Sandbox Code Playgroud)

  • @Glide - 可能无话可说.赏金的原因是什么? (3认同)