Мне нужен regex, который проверяет для минимальных 7 цифр в данной строке

Мне нравятся эти методы за контакт с перечислениями, которые имеют набор атрибута Флагов:

public static bool AnyOf(this object mask, object flags)
{
    return ((int)mask & (int)flags) != 0;
}
public static bool AllOf(this object mask, object flags)
{
    return ((int)mask & (int)flags) == (int)flags;
}
public static object SetOn(this object mask, object flags)
{
    return (int)mask | (int)flags;
}
etc.

использование В качестве примера:

var options = SomeOptions.OptionA;
options = options.SetOn(OptionB);
options = options.SetOn(OptionC);

if (options.AnyOf(SomeOptions.OptionA | SomeOptions.OptionB))
{
etc.

исходные методы были от этой статьи: http://www.codeproject.com/KB/cs/masksandflags.aspx?display=Print я просто преобразовал их в дополнительные методы.

одна проблема с ними, хотя то, что параметры типа объекта, что означает, что весь объекты заканчивают тем, что были расширены с помощью этих методов, тогда как идеально они должны только относиться к перечислениям.

Обновление Согласно комментариям, можно обойти "загрязнение подписи", за счет производительности, как это:

public static bool AnyOf(this Enum mask, object flags)
{
    return (Convert.ToInt642(mask) & (int)flags) != 0;
}

15
задан Shimmy 23 July 2009 в 04:57
поделиться

3 ответа

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

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

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

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

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

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

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

7
ответ дан 1 December 2019 в 00:37
поделиться

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

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

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

s.Count(c => c >= '0' && c <= '9') >= 7;
1
ответ дан 1 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: