Здравствуйте, sjukov, Вы писали:
S>std::regex re ("(\\d+?),(.*?),(.*?),(.*?),(.*?)$") ; S>Для такой строки S>std::string sStr = "[xxx]:6,000000000,A,,TEST MESSAGE"; S>Ведь в первом параметре говорится что должны быть цифры, а там фигня другая.
Там таки да, говорится, что должны быть цифры (хоть одна) перед запятой.
Там таки не говорится, что до цифр не может идти какой-нибудь мусор.
Если хотите, чтобы регексп срабатывал от самого начала строки, то надо вставить каретку:
std::regex re ("^(\\d+?),(.*?),(.*?),(.*?),(.*?)$") ;
Здравствуйте, sjukov, Вы писали:
S>Я почему то думал что факт того что вначале что-то идет надо оговаривать отдельно, и всегда писал что-то типа: S>std::regex re ("[a-z,.]*?(\\d+?),(.*?),(.*?),(.*?),(.*?)$") ;
Это мысль неверная. В любом учебнике по регекспам (или перлу, который сам один большой регексп) начинают с того, что ищут подстроку в строке. При этом часть строки, не подходящая под регексп, пропускается.
Здравствуйте, sjukov, Вы писали:
S>Коллеги !
S>Объясните пожалуйста почему срабатывает такой Regex ?
S>std::regex re ("(\\d+?),(.*?),(.*?),(.*?),(.*?)$") ;
S>Для такой строки
S>std::string sStr = "[xxx]:6,000000000,A,,TEST MESSAGE";
S>Ведь в первом параметре говорится что должны быть цифры, а там фигня другая.
S>Спасибо !
Это вообще-то вопрос не к регэкспу, а к тому, как он используется.
Обычно есть функция "найти подстроку по регэкспу" (std::regex_search, я так понимаю, ты юзаешь ее), и есть функция "проверить, соответствует ли регэкспу вся строка целиком" (std::regex_match):
regex_search
Determines whether there is some sub-sequence within [first,last) that matches the regular expression e.
regex_match
Determines whether there is a match between the regular expression e, and all of the character sequence [first,last).
Если твой регэксп засунуть во вторую функцию, то он, понятно дело, обломится безо всяких дополнительных кареток.
ЗЫ
C точностью до кареток, между функциями есть простое соответствие:
regex_search(re) == regex_match(.*re.*)
regex_match(re) == regex_search(^re$)