Ответ 1
Семь или более цифр, смешанных с любым количеством любого другого персонажа? Это не похоже на очень полезное требование, но здесь вы идете:
^\D*(?:\d\D*){7,}$
Я хочу подтвердить номер телефона. Мое условие состоит в том, что я хочу получить минимальные 7 чисел в данной строке, игнорируя разделители, X, скобки.
На самом деле я хочу добиться этой функции в regex:
Func<string, bool> Validate = s => s.ToCharArray().Where(char.IsDigit).Count() >= 7;
Func<string, bool> RegexValidate = s => System.Text.RegularExpressions.Regex.IsMatch(s, @"regex pattern should come here.")
string x = "asda 1234567 sdfasdf";
string y = "asda sdfa 123456 sdfasdf";
bool xx = Validate(x); //true
bool yy = Validate(y); //false
Цель моей потребности: я хочу включить это регулярное выражение в asp: RegularExpressionValidator
Семь или более цифр, смешанных с любым количеством любого другого персонажа? Это не похоже на очень полезное требование, но здесь вы идете:
^\D*(?:\d\D*){7,}$
(?:\d.*){7,}
(?:...)
- группировать содержащийся рисунок в атомную единицу\d
- сопоставить цифру.*
соответствует 0 или более символов{7,}
соответствует 7 или более предыдущему шаблонуЕсли единственными разделителями, которые вы хотите игнорировать, являются пробелы, тире, круглые скобки и символ "X", а затем используйте это:
(?:\d[- ()X]*){7,}
[...]
создает класс символов, соответствующий любому из содержащихся символовОтличие состоит в том, что первое регулярное выражение будет соответствовать "a1b2c3d4e5f6g7h"
, а второе не будет.
Как отмечает Грегор в комментариях, выбор регулярного выражения зависит от того, с какой функцией вы его используете. Некоторые функции ожидают, что регулярное выражение будет соответствовать всей строке, и в этом случае вы должны добавить дополнительный .*
спереди, чтобы соответствовать любому заполнению до 7 цифр. Некоторые только ожидают, что регулярное выражение будет соответствовать части строки (что и ожидалось в моих примерах).
В соответствии с документацией для IsMatch()
он только "указывает, находит ли регулярное выражение совпадение во входной строке", не требует его чтобы соответствовать всей строке, поэтому вам не нужно изменять мои примеры, чтобы они могли работать.
Почему вы хотите использовать для этого регулярные выражения? Первая функция Validate
, которую вы указали, которая просто подсчитывает количество цифр, намного более понятна и, вероятно, быстрее. Я просто удалю ненужный вызов ToCharArray
, скрою предикат в функцию Count
и сделаю с ним:
s.Count(char.IsDigit) >= 7;
Обратите внимание, что если вы хотите принимать только "нормальные" номера (например, 0-9), вы хотите изменить функцию проверки, так как IsDigit
соответствует многим различным представлениям числа, например
s.Count(c => c >= '0' && c <= '9') >= 7;