2015-02-24 2 views
2

Как получается следующее: true?Явное регулярное выражение Java неожиданно встречается

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

Не должна ли она терпеть неудачу на (?=.{8,12}), поскольку его длина находится вне диапазона?

+0

'. {8,12}' соответствует 8 до 12 символов в любом месте в строке. – mustaccio

+0

@mustaccio Какие изменения необходимы для проверки строки на основе длины и других требований (содержит верхний регистр и цифру)? – Glide

+0

@Pshemo Вы уверены? Он компилируется для меня. – Glide

ответ

11

find() не проверяет, может ли целая строка соответствовать регулярному выражению, matches(). find просто пытается найти любую подстроку, которая может быть сопоставлена ​​регулярным выражением. Также (?=.{8,12}) проверьте, есть ли место после 8-12 символов. Так что либо добавить anchors^$ в своем регулярном выражении, представляющий начало и конец строки, как

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

или использовать 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 
+0

Что случилось со всеми комментариями? – Glide

+3

@Glide - наверное, нечего сказать. Почему щедрость? – sln

+0

@sln Я подозреваю, что эти комментарии представляют причину щедрости. Они походят на поэтапный вводный курс для некоторого механизма регулярных выражений, позволяющего OP и другим читателям лучше понять этот ответ, поэтому мне кажется странным, что они были удалены. Этот урок был довольно длинным (12-16 комментариев о^$, look-around, zero-width), поэтому я решил не размещать его непосредственно в ответ, который, вероятно, был ошибкой, поскольку он был удален сейчас :( – Pshemo