минимальное число в строке должно быть 1 регулярное выражение проверки? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть строка, которой я должен соответствовать.Это означает, что он должен содержать только число с последующим пробелом или только число, а минимальное число должно быть всегда 1.Например:

3 1 2
1 p 3
6 3 2
0 3 2

Первая и третья строки действительны, а все остальные - нет.

Я предложил регулярное выражение ниже, но я не уверен, как я могу проверить минимальное число в этомстрока должна быть всегда 1?

str.matches("(\\d|\\s)+")

Регулярное выражение используется от здесь

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

Если он должен содержать только число с последующим пробелом или только число, и минимальное число должно быть 1, а число также может быть больше 10, вы можете использовать:

^[1-9]\\d*(?: [1-9]\\d*)*$

Обратите внимание, что если вы хотитесоответствует только пробел, вместо использования \s, который соответствует большему , вы можете просто добавить пробел в шаблон.

Пояснение

  • ^ Утверждение начала строки
  • [1-9]\\d* Совпадение числа от 1 до
  • (?: [1-9]\\d*)* Повторение числа от 1 с добавленным пробелом
  • $ Утверждение конца строки

Regex demo

0 голосов
/ 06 февраля 2019

Не все можно или нужно решать с помощью регулярных выражений.

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

str.matches("((\\d+)\\s)+")

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

Если это совпадает, вы разделяете пробелы, и для каждой группы цифр вы превращаете его в число и проверяете по допустимому диапазону.

У меня естьвнутреннее ощущение, что регулярных выражений на самом деле недостаточно для того типа проверки, который вам нужен.

0 голосов
/ 06 февраля 2019

Regex является частью решения.Но я не думаю, что одно только регулярное выражение может решить вашу проблему.

Это мое предлагаемое решение:

private static boolean isValid(String str) {
    Pattern pattern = Pattern.compile("[(\\d+)\\s]+");
    Matcher matcher = pattern.matcher(str);

    return matcher.matches() && Arrays.stream(Arrays.stream(matcher.group().split(" "))
            .mapToInt(Integer::parseInt)
            .toArray()).min().getAsInt() == 1;
}

Обратите внимание на тип отображения: matcher.matches () - чтобы проверитьсопоставить со всем вводом.(не используйте matcher.find () - потому что он не будет отклонять неверные данные, такие как «1 p 2»)

0 голосов
/ 06 февраля 2019

Просто замените \\d на [1-9].

\\d - это просто сокращение для класса [0-9].

Хотя это лучшее регулярное выражение: ([1-9]\\s)*[1-9]$,так как он решает проблемы с двузначными числами и не оставляет места в конце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...