Вы можете попробовать
^[0-9]{1,3}(?:\-[0-9]{1,3})?(?:,\s?[0-9]{1,3}(?:\-[0-9]{1,3})?)*$
шаблон, где
^ String start
0*[0-9]{1,3} 1 to 3 digits
(?:\-[0-9]{1,3})? Possible minus (-) followed 1 to 3 digits (e.g. -456)
?:,\s? Comma and at most one whitespace
[0-9]{1,3}(?:\-[0-9]{1,3})?)* 1 to 3 digits or range repeated zero or more times
$ End of string
Демо-версия:
string pattern =
@"^[0-9]{1,3}(?:\-[0-9]{1,3})?(?:,\s?[0-9]{1,3}(?:\-[0-9]{1,3})?)*$";
string[] tests = new string[] {
"123",
"1234",
"123-456",
"123,456",
"1-100,134,200",
"1,18,100",
"1, 18, 100",
"1, 18,100",
"1-,18,100",
"-2,18,100",
"1,,18,100",
"1, ,18,100",
",2,18,100",
"1,18,100,",
};
string[] results = tests
.Select(test => $"{test,-20} --> {(Regex.IsMatch(test, pattern) ? "PASS" : "FAIL")}")
.ToArray();
string report = string.Join(Environment.NewLine, results);
Console.Write(report);
Результат:
123 --> PASS
1234 --> FAIL
123-456 --> PASS
123,456 --> PASS
1-100,134,200 --> PASS
1,18,100 --> PASS
1, 18, 100 --> PASS
1, 18,100 --> FAIL
1-,18,100 --> FAIL
-2,18,100 --> FAIL
1,,18,100 --> FAIL
1, ,18,100 --> FAIL
,2,18,100 --> FAIL
1,18,100, --> FAIL
Редактировать:
- Если вы хотите разрешить произвольное количество ведущих нулей (например,
000123
, что на самом деле 123
), измените каждый фрагмент [0-9]{1,3}
на 0*[0-9]{1,3}
- Если вы хотите запретить начальные нули (
012
должен произойти сбой, когда 12
или 0
должен пройти), измените каждый фрагмент [0-9]{1,3}
на (?:0|[1-9][0-9]{0,2})