Проблема с первым регулярным выражением ("(?=.*[a-z])"
) заключается в том, что вы пытаетесь сопоставить последовательность, которая заканчивается на a-z
; *
применяется к .
, который в целом говорит: «сопоставьте что-либо, затем заканчивайте буквой от a
до z
».
Чтобы передать буквальный обратный слеш, вам нужно экранировать его так: "(?=.*\\d)"
.
Недопустимая escape-последовательность из-за того, что Java пытается обработать escape-последовательности в строке до того, как она будет передана в регулярное выражение - \d
не сопоставляется ни с чем, в отличие от \t
или \n
, которые отображаются на tab и перевод строки.
Чтобы упростить процесс разработки с помощью регулярных выражений, я бы предложил использовать такой инструмент, как Regex Coach , который позволит вам проверить свои регулярные выражения перед компиляцией программы, чтобы вы могли увидеть результаты в режиме реального времени. Есть также онлайн-ресурсы, такие как RegExr .
Исходя из проблем, с которыми вы столкнулись, не мешало бы пробежаться и по некоторым учебникам по регулярным выражениям.