Мне нужно регулярное выражение, которое проверяет не менее 7 цифр в данной строке - PullRequest
15 голосов
/ 13 июля 2009

Я хочу подтвердить номер телефона. Мое условие - я хочу, чтобы в данной строке было минимум 7 чисел, игнорируя разделители, X, паразиты.

На самом деле я хочу добиться этой функции в регулярном выражении:

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

Ответы [ 3 ]

35 голосов
/ 13 июля 2009

Семь или более цифр, смешанных с любым числом символов любого другого типа? Это не кажется очень полезным требованием, но здесь вы идете:

^\D*(?:\d\D*){7,}$
7 голосов
/ 13 июля 2009
(?:\d.*){7,}
  • (?:...) - сгруппировать содержащийся шаблон в атомную единицу
  • \d - соответствует цифре
  • .* соответствует 0 или более символам
  • {7,} соответствует 7 или более из предыдущего шаблона

Если единственными разделителями, которые вы хотите игнорировать, являются пробелы, тире, скобки и символ 'X', используйте вместо этого:

(?:\d[- ()X]*){7,}
  • [...] создает класс символов, соответствующий любому из содержащихся в нем символов

Разница, например, в том, что первое регулярное выражение будет соответствовать "a1b2c3d4e5f6g7h", а второе - нет.

Как указывает Грегор в комментариях, выбор регулярного выражения зависит от того, с какой функцией вы его используете. Некоторые функции ожидают, что регулярное выражение будет соответствовать всей строке, и в этом случае вы должны добавить дополнительный .* перед, чтобы соответствовать любому заполнению перед 7 цифрами. Некоторые ожидают, что регулярное выражение будет соответствовать части строки (что я и ожидал в моих примерах).

Согласно документации для IsMatch() он только «указывает, находит ли регулярное выражение совпадение во входной строке», не требует, чтобы он совпадал со всей строкой, поэтому вам не нужно измени мои примеры, чтобы они работали.

1 голос
/ 13 июля 2009

Почему вы хотите использовать регулярные выражения для этого? Первая опубликованная вами функция Validate, которая просто подсчитывает количество цифр, гораздо более понятна и, возможно, также быстрее. Я бы просто отбросил ненужный вызов ToCharArray, свернул предикат в функцию Count и покончил бы с этим:

s.Count(char.IsDigit) >= 7;

Обратите внимание, что если вы хотите принимать только "нормальные" числа (т. Е. 0-9), вам нужно изменить функцию проверки, так как IsDigit соответствует множеству различных представлений чисел, например,

s.Count(c => c >= '0' && c <= '9') >= 7;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...