Простое решение таково:
^\d{7}(\d{3})?$
В этом решении нужно отметить по крайней мере две вещи:
- В контексте Юникода
\d
может соответствовать намного больше, чем вы предполагали (например, иностранные символы, которые являются цифрами в других нелатинских языках).
- Это регулярное выражение содержит группу захвата. Вы, вероятно, не хотите этого. Это можно исправить, изменив группу без захвата
(?: ... )
.
Так что по этим причинам вы можете использовать это более длинное выражение:
^[0-9]{7}(?:[0-9]{3})?$
Вот небольшой тестовый стенд в C #, чтобы вы могли увидеть, как он работает:
for (int i = 0; i < 12; ++i)
{
string input = new string('0', i);
bool isMatch = Regex.IsMatch(input, "^[0-9]{7}(?:[0-9]{3})?$");
Console.WriteLine(i.ToString().PadLeft(2) + ": " + isMatch);
}
Результат:
0: False
1: False
2: False
3: False
4: False
5: False
6: False
7: True
8: False
9: False
10: True
11: False