Glide
Glide

Reputation: 21275

Java regular expression matches unexpectedly

How come the following returns true?

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

Shouldn't it fail on (?=.{8,12}) since its length is outside of the range?

Upvotes: 2

Views: 323

Answers (1)

Pshemo
Pshemo

Reputation: 124285

find() doesn't check if entire string can be matched by regex, matches() does. find simply tries to find any substring which can be matched by regex. Also (?=.{8,12}) check if there is place which has 8 to 12 characters after it. So either add anchors ^ $ in your regex representing start and end of the string like

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

or use matches() with this regex

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

Upvotes: 11

Related Questions