Я пытаюсь написать регулярное выражение, которое принимает строку в качестве входных данных, а также может включать запятую и дефис и проверяет действительное число в пределах от 1 до 150, полученное в следующем регулярном выражении, но оно терпит неудачу, если я задаю строку как 1-151, поскольку он считает действительным 51 из 151.

 1,10,1-150,25 valid
 0,1-10 invalid(as 0 is present)
 1,2,3-151,5 invalid (as 151 is present)
 10,0-4,5 invalid (as 0 is present)

Регулярное выражение, которое я написал

 ([1-9][,-])|([1-8][0-9][,-])|9[0-9][,-]|1[0-4][0-9][,-]|150[,-]
3
G-- 26 Сен 2018 в 09:50

2 ответа

Лучший ответ

Это регулярное выражение будет делать то, что вы хотите:

^(([1-9]|[1-9][0-9]|1[0-4][0-9]|150)([,-](?=\d)|$))+$

Он ищет набор действительных чисел (1-9, 10-99, 100-149, 150) и проверяет, следует ли за каждым номером либо ,, -, либо конец строки ($ ) . Если после числа следует запятая или дефис, он проверяет, является ли следующий символ цифрой, чтобы он не соответствовал (например) 1, или 34-.

Regex101 demo

3
Nick 26 Сен 2018 в 07:28

Как сказал @ some1, использование Split с небольшим количеством Linq намного легче читать (а позже изменять, улучшать и т. Д.). По крайней мере, вот такая альтернатива:

private static bool IsValid(string s)
{
    return s.Split(new []{',','-'}).Select(int.Parse).All(x => x > 0 && x < 151);
}

Попробуйте онлайн!

Следуя предложению @Rawling и @Dmitry Bychenko

private static bool IsValid(string s)
{
    return s.Split(new []{',','-'}).All(x => int.TryParse(x, out var v) && v >= 1 && v <= 150);
}

Попробуйте онлайн!

1
aloisdg moving to codidact.com 26 Сен 2018 в 09:00