Длина некоторых символов в регулярном выражении - PullRequest
0 голосов
/ 26 октября 2018

У меня есть следующее регулярное выражение:

\+?[0-9\.,()\-\s]+$

, что позволяет:

  • опционально + в начале
  • затем цифры, точки, запятые, круглые скобки, тире и пробелы.

Кроме того, мне нужно убедиться, что количество цифр и символа плюс (если существует) имеет длину от 9 до 15 (поэтому я не считаю никаких специальных символов, кроме символа +).

И с этим последним состоянием у меня проблемы.

допустимые значения:

  • + 358 (9) 1234567
  • + 3 5 8,9,1-2 (3) 4..5,6.7 (25 знаков, но только 12 знаков, которые считаются (цифры и символ плюс))

неверный ввод:

  • + 3 5 8,9,1-2 (3) 4..5,6.777777777 (33 символа и только 20 символов, число которых (цифры и символ плюс) слишком много)

Важно использовать регулярное выражение, если это возможно, потому что оно используется в аннотации javax.validation.constraints.Pattern как:

@Pattern(regexp = REGEX) 
private String number;

где мой REGEX - это то, что я ищу здесь.

И если регулярное выражение не может быть предоставлено, то это означает, что мне нужно переписать мою реализацию проверки сущности. Так можно ли добавить такое условие в регулярное выражение или мне нужна функция для проверки такого шаблона?

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Не используя регулярное выражение, вы можете просто зациклить и подсчитать числа и + s:

int count = 0;
for (int i = 0; i < str.length(); i++) {
    if (Character.isDigit(str.charAt(i)) || str.charAt(i) == '+') {
        count++;
    }
}
0 голосов
/ 26 октября 2018

Поскольку вы используете Java, я бы не стал полагаться здесь исключительно на регулярное выражение:

String input = "+123,456.789";
int count = input.replaceAll("[^0-9+]", "").length();
if (input.matches("^\\+?[0-9.,()\\-\\s]+$") && count >= 9 && count <= 15) {
    System.out.println("PASS");
}
else {
    System.out.println("FAIL");
}

Этот подход позволяет нам просто использовать ваше первоначальное регулярное выражение.Мы обрабатываем требования к длине чисел (и, возможно, плюс), используя строковые вызовы Java.

0 голосов
/ 26 октября 2018

Вы можете использовать

^(?=(?:[^0-9+]*[0-9+]){9,15}[^0-9+]*$)\+?[0-9.,()\s-]+$

См. Демоверсию regex

Подробности

  • ^- начало строки
  • (?=(?:[^0-9+]*[0-9+]){9,15}[^0-9+]*$) - положительный прогноз, образец которого должен соответствовать регулярному выражению, чтобы найти совпадение:

    • (?:[^0-9+]*[0-9+]){9,15} - от 9 до 15 повторений
    • [^0-9+]* - любые 0+ символов, кроме цифр и + символа
    • [0-9+] - цифры или +
    • [^0-9+]* - 0+символы отличные от цифр и +
    • $ - конец строки
  • \+? - необязательный символ +

  • [0-9.,()\s-]+ - 1 или более цифр, ., ,, (, ), пробел и - символов
  • $ - конец строки.

В Java при использовании с matches() якоря ^ и $ могут быть опущены:

s.matches("(?=(?:[^0-9+]*[0-9+]){9,15}[^0-9+]*$)\\+?[0-9.,()\\s-]+")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...