Если вам нужно сопоставлять только строку, соответствующую первому требованию, когда в ней есть от 3 до 24 цифр, вам нужно посмотреть (?=(?:\D*\d){3,23}\D*$)
в начале:
^(?=(?:\D*\d){3,23}\D*$)[a-zA-Z0-9_ -]*$
Поскольку в Java [a-zA-Z0-9_]
можно записать как \w
, смело используйте
^(?=(?:\D*\d){3,23}\D*$)[\w -]*$
И для сопоставления пробелов вы можете использовать \s
вместо обычного пробела:
^(?=(?:\D*\d){3,23}\D*$)[\w\s-]*$
См. Демонстрационную версию regex (изменена, поскольку шаблон проверен на одной многострочной строке).
Детали
^
- начало строки
(?=(?:\D*\d){3,23}\D*$)
- должно быть от 3 до 23 последовательностей 0+ нецифровых символов, за которыми следует цифра, а затем любые 0+ нецифровых символов до конца строки
[\w\s-]*
- 0+ букв, цифр, _
, пробелов и -
символов
$
- до конца строки.
Пример использования Java:
boolean valid = s.matches("(?=(?:\\D*\\d){3,23}\\D*$)[\\w\\s-]*");
Обратите внимание, что String#matches
требует полного совпадения строк, поэтому якоря являются избыточными.