Здравствуйте, сколько лет пишу кодб столько лет регулярные выражения для меня остаются темным пятном, поэтому прошу помощи в простом вопросе.
Есть строка в которой числа от 5 до 200 через запятую их 24, числа могут повторятся нужно проверить что эта строка соответствует формату, то есть в ней нет букв, нет символов кроме запятой и чисел 24. Пример строки "102,195,145,100,196,152,184,39,185,192,152,149,80,141,17,142,45,148,137,60,145,60,6,133"
Спасибо.
В этом регулярном выражении, проверятся, чисел длиной 1-3 символа через запятую 24 числа. Пока непойму как ограничить число от 5 до 200 и после 24 цифры как запятую запретить постановку запятой.
_>В этом регулярном выражении, проверятся, чисел длиной 1-3 символа через запятую 24 числа. Пока непойму как ограничить число от 5 до 200 и после 24 цифры как запятую запретить постановку запятой.
Начните с того, что искомая строка есть цепочка из 23 чисел с запятой, плюс еще одно число без запятой в конце строки.
Здравствуйте, Qulac, Вы писали: Q>Начните с того, что искомая строка есть цепочка из 23 чисел с запятой, плюс еще одно число без запятой в конце строки.
Здравствуйте, _agg, Вы писали:
_>Вот теперь проверяет чтобы в конце 24-го числа не было запятой, остался вопрос только как ограничить числа от 5 до 200, кто знает плиз подскажите: _>
_>Здравствуйте, Qulac, Вы писали: Q>>Начните с того, что искомая строка есть цепочка из 23 чисел с запятой, плюс еще одно число без запятой в конце строки.
Итак дальше. Число у нас это либо любая из цифр 5,6,7,8,9; либо любая цифра кроме 0 плюс цифра; либо 1, цифра, цифра; либо 200. Осталось написать, вставить и не запутаться.
int str_valid(const char* s)
{
unsigned u;
int n, cnt = 0, r;
while (1) {
r = sscanf(s, "%u%n", &u, &n);
if (r == 0 || r == EOF)
return 0;
if (u < 5 || u > 200)
return 0;
cnt++;
s += n;
if (cnt == 24)
if (*s == '\0')
return 1;
else
return 0;
if (*s != ',')
return 0;
s++;
}
}
Здравствуйте, _agg, Вы писали:
_>Здравствуйте, сколько лет пишу кодб столько лет регулярные выражения для меня остаются темным пятном, поэтому прошу помощи в простом вопросе. _> Есть строка в которой числа от 5 до 200 через запятую их 24, числа могут повторятся нужно проверить что эта строка соответствует формату, то есть в ней нет букв, нет символов кроме запятой и чисел 24. Пример строки "102,195,145,100,196,152,184,39,185,192,152,149,80,141,17,142,45,148,137,60,145,60,6,133" _>Спасибо.
Здравствуйте, MasterZiv, Вы писали:
MZ>Здравствуйте, _agg, Вы писали:
_>>Здравствуйте, сколько лет пишу кодб столько лет регулярные выражения для меня остаются темным пятном, поэтому прошу помощи в простом вопросе. _>> Есть строка в которой числа от 5 до 200 через запятую их 24, числа могут повторятся нужно проверить что эта строка соответствует формату, то есть в ней нет букв, нет символов кроме запятой и чисел 24. Пример строки "102,195,145,100,196,152,184,39,185,192,152,149,80,141,17,142,45,148,137,60,145,60,6,133" _>>Спасибо.
MZ>регвыр.
MZ>^(\d+)(,\d+)*$
MZ>регвыр. на С MZ>"^(\\d+)(,\\d+)*$"
Я не заметил "и чисел 24", выражение неправильное.
Здравствуйте, MasterZiv, Вы писали:
MZ>Я не заметил "и чисел 24"
у тебя в целом с внимательностью проблемы. перечитай исходный пост внимательнее, чтобы понять задачу
а еще можешь ветку прочитать и найти правильные ответы (они отмечены плюсиками)
MZ>Правильное --
неправильно
Здравствуйте, _agg, Вы писали:
_>Здравствуйте, сколько лет пишу кодб столько лет регулярные выражения для меня остаются темным пятном, поэтому прошу помощи в простом вопросе. _> Есть строка в которой числа от 5 до 200 через запятую их 24, числа могут повторятся нужно проверить что эта строка соответствует формату, то есть в ней нет букв, нет символов кроме запятой и чисел 24. Пример строки "102,195,145,100,196,152,184,39,185,192,152,149,80,141,17,142,45,148,137,60,145,60,6,133" _>Спасибо.
Регекспы бывают позиксовые и перловые, у них несколько разный синтаксис. Поэтому хорошо бы уточнить с самого начала, о чём идёт речь.
Теперь сам регексп
"число от 5 до 200" NUMBER = ([5-9]|[1-9][0-9]|1[0-9][0-9]|200)
"24 числа" LIST = NUMBER(,NUMBER){23}
"только список" ^LIST$
Но, имхо, толку от такого регекспа — минимум. Он лишь даст ответ "правда ли, что строка — это 24 числа от 5 до 200, или нет". И что дальше?
Либо парсить список, либо сообщить о конкретной ошибке. Ну так об ошибке можно было бы сообщить во время разбора.
По условиям задачи если строка соответствует то ее можно отправлять, поэтому этого минимума толка более чем достаточно, спасибо.
К>Но, имхо, толку от такого регекспа — минимум. Он лишь даст ответ "правда ли, что строка — это 24 числа от 5 до 200, или нет". И что дальше? К>Либо парсить список, либо сообщить о конкретной ошибке. Ну так об ошибке можно было бы сообщить во время разбора.
Здравствуйте, uzhas, Вы писали:
U>у тебя в целом с внимательностью проблемы. перечитай исходный пост внимательнее, чтобы понять задачу U>а еще можешь ветку прочитать и найти правильные ответы (они отмечены плюсиками)
MZ>>Правильное -- U>неправильно