Регулярное выражение, чтобы определить, содержит ли строка как минимум 2 числа

Я пытаюсь написать валидатор поля имени пользователя, и одно из требований состоит в том, что поле должно содержать как минимум 2 числа (можно больше, но не меньше). Я думал, что смогу сделать что-то подобное, и регулярное выражение разбивается на первое число, но никогда на второе.

    String[] arr = string.split("[0-9][0-9]");
    return arr.length > 2;

Варианты использования: Bob11 Bo1b1 11Bob 1Bob1


person Aaron Bar    schedule 15.03.2018    source источник


Ответы (7)


Попробуй это:

  • .* соответствует всему (от 0 до n раз)
  • [0-9] число от 0 до 9

Pattern pattern = Pattern.compile("[0-9].*[0-9]");
Matcher matcher = pattern.matcher(string);
if (matcher.find()) {
   return true;
}
And you can check regex in https://www.freeformatter.com/regex-tester.html

person Tung Tran    schedule 15.03.2018
comment
Это не позволяет ничего после последней цифры. - person Ch4t4r; 15.03.2018
comment
минимум 2 числа знаете? - person Tung Tran; 15.03.2018
comment
Это сделало работу. Спасибо. Это также дало мне достаточно хлебных крошек, чтобы выяснить остальную часть запроса на соответствие шаблону имени пользователя. Благодарю вас! - person Aaron Bar; 16.03.2018
comment
Полное требование - это 2 числа, по крайней мере, 1 в верхнем регистре и 1 в нижнем регистре, выполненные в три этапа, поэтому каждый из них будет выдавать отдельное сообщение об ошибке. Я использовал ваш ответ, чтобы также построить: верхний регистр = (.*[AZ].*) и нижний регистр = (.*[az].*). Еще раз спасибо. - person Aaron Bar; 16.03.2018

Ниже приведена моя версия, которая выполняется чрезвычайно быстро, легко обновляется по различным критериям и имеет лучшую читабельность (по крайней мере, для меня):

Регулярное выражение
(\D*\d){2,}

Пример

Bob11   - Match
Bo1b1   - Match
11Bob   - Match
1Bob1   - Match
11235   - Match

Bobb    - Does NOT Match
Bob1    - Does NOT Match
Bo1b    - Does NOT Match
1Bob    - Does NOT Match

Объяснение
\D – не цифра.
* – (квантификатор) ноль или более раз.
\d – одна цифра.
(\D*\d) – инкапсулирует приведенную выше комбинацию. как группа.
{2,} - (квантификатор) гарантирует, что группа встречается как минимум 2 раза, а может встречаться больше раз.

(\D*\d){2,} - Итак, \D* нецифровое ноль или бесконечное количество раз, за ​​которым следует цифра \d, эта комбинация повторяется {2,} два или бесконечное количество раз.

Обновление в соответствии с другими критериями
^ (привязка начальной строки) и $ (привязка конечной строки) могут быть включены, чтобы гарантировать ограничение, в случае изменения критерия на точное значение 2 или любое другое число. Это пример, который гарантирует не более, не менее 5 цифр в строке: ^(\D*\d){5}\D*$. Последний \D необходим, чтобы строка могла заканчиваться не цифрой, проверяя правильность регулярного выражения, если удовлетворяются критерии из пяти цифр.*

person Vitox    schedule 27.01.2020

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

person Diego Vieira    schedule 15.03.2018

[^\d]*\d[^\d]*\d.* должен быть один путь (их несколько..)

  • [^\d]* Соответствует любому символу, который не является цифрой (от нуля до бесконечности)
  • \d соответствует одной цифре (один раз)
  • .* соответствует всему (от нуля до бесконечности)

Я использую [^\d]*, потому что .* жадный и поэтому может совпадать со слишком большим количеством совпадений (в зависимости от языка). Жадное поведение можно отключить, добавив ?: .*?

Вы можете протестировать его на странице https://regex101.com/.

person Ch4t4r    schedule 15.03.2018

Используйте string.match(‘.*\d.*\d.*’); Он будет искать одну цифру два раза в строке.

person hi olaf    schedule 15.03.2018
comment
Это, скорее всего, соответствует всему, потому что .* жадный - person Ch4t4r; 15.03.2018
comment
@Ch4t4r, вы можете попробовать это регулярное выражение на сайте, который вы упомянули в своем ответе, и убедиться, что оно работает должным образом. Флаг жадности полезен, когда доступно несколько совпадений, чтобы помочь регулярному выражению выбрать одно. В этом случае он просто должен найти 2 цифры. Однако он должен найти как минимум 2, чтобы вернуть совпадение. - person hi olaf; 17.03.2018
comment
Ну, я не минусовал твой ответ. В некоторых случаях .* может не давать желаемого поведения, потому что он жадный - хотя я не проверял этот случай. - person Ch4t4r; 17.03.2018


Для этого вам не нужен RegEx. Я не уверен, какой язык вы используете, но можно с уверенностью предположить, что String в вашем языке по сути является массивом Char. Если это так, то получите количество цифровых символов в массиве Char и сравните, больше ли оно 1.

Например, вот пример C#:

String username = Console.ReadLine();
if (username.Count(c => Char.IsDigit(c)) > 1) {
    Console.WriteLine("The String contains 2 or more digits.");
} else {
    Console.WriteLine("The String did not contain 2 or more digits.");  
}

Это, вероятно, также даст более быстрые результаты.

person David    schedule 15.03.2018