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

1.Регулярное выражение для проверки принадлежности пятизначного числа диапазона [10311; 89645].

2.Написать регулярное выражение для проверки правильности ввода имени. Имя имеет вводиться с большой буквы.

  1. ^(10311|\d[0-9]\d|89645)$

Ответы (2 шт):

Автор решения: Alex R.
  1. Диапазон

с математикой (можно заменить [0-9] на \d)

^(1[0-9]{1}[3-9]{1}[1-9]{2})|([2-7]{1}[0-9]{4})|(8[0-9]{1}[0-6]{1}[0-4]{1}[0-5]{1})$

без математики

^[1-8]{1}[0-9]{1}[3-6]{1}[1-4]{1}[1-5]{1}$
  1. Имя

Без дефиса

^[A-ZА-Я]{1}[a-zа-я]+$

С дефисом

^[A-ZА-Я]{1}[a-zа-я]+(-[A-ZА-Я]{1}[a-zа-я]+)*$

Выражения написаны из расчета одно значение в одной строке.

→ Ссылка
Автор решения: Alexander Petrov

Для проверки диапазона я сочинил такое:

string pattern = 
@"^ (1031[1-9] | 103[2-9]\d | 10[4-9]\d{2} | 1[1-9]\d{3} | [2-7]\d{4} | [8][0-8]\d{3} | 89[0-5]\d{2} | 896[0-3]\d | 8964[0-5]) $";
bool result = false;

for (int n = 0; n < 10311; n++)
{
    result = Regex.IsMatch(n.ToString(), pattern, RegexOptions.IgnorePatternWhitespace);
    if (result)
    {
        Console.WriteLine(n);
        break;
    }
}
Console.WriteLine(result);

for (int n = 10311; n <= 89645; n++)
{
    result = Regex.IsMatch(n.ToString(), pattern, RegexOptions.IgnorePatternWhitespace);
    if (!result)
    {
        Console.WriteLine(n);
        break;
    }
}
Console.WriteLine(result);

for (int n = 89646; n < 1_000_000; n++) // int.MaxValue
{
    result = Regex.IsMatch(n.ToString(), pattern, RegexOptions.IgnorePatternWhitespace);
    if (result)
    {
        Console.WriteLine(n);
        break;
    }
}
Console.WriteLine(result);

Выдаёт False, True, False, что означает корректность регулярки.

Желательно в последнем цикле поставить значение int.MaxValue, но ждать завершения придётся долго.


Для проверки имён можно использовать категории юникода.

@"^\p{Lu}\p{Ll}+$"

где Lu - буква в верхнем регистре, Ll - буква в нижнем регистре.
Тут имеются в виду буквы любых алфавитов мира.

→ Ссылка