Почему срабатывает regex ?
От: sjukov Украина  
Дата: 09.02.14 17:29
Оценка:
Коллеги !

Объясните пожалуйста почему срабатывает такой Regex ?


std::regex re ("(\\d+?),(.*?),(.*?),(.*?),(.*?)$") ;

Для такой строки

std::string sStr = "[xxx]:6,000000000,A,,TEST MESSAGE";

Ведь в первом параметре говорится что должны быть цифры, а там фигня другая.

Спасибо !
Re: Почему срабатывает regex ?
От: Хреннос  
Дата: 09.02.14 19:59
Оценка: +1
Здравствуйте, sjukov, Вы писали:

S>std::regex re ("(\\d+?),(.*?),(.*?),(.*?),(.*?)$") ;

S>Для такой строки
S>std::string sStr = "[xxx]:6,000000000,A,,TEST MESSAGE";
S>Ведь в первом параметре говорится что должны быть цифры, а там фигня другая.

Там таки да, говорится, что должны быть цифры (хоть одна) перед запятой.
Там таки не говорится, что до цифр не может идти какой-нибудь мусор.

Если хотите, чтобы регексп срабатывал от самого начала строки, то надо вставить каретку:
std::regex re ("^(\\d+?),(.*?),(.*?),(.*?),(.*?)$") ;
Re[2]: Почему срабатывает regex ?
От: sjukov Украина  
Дата: 09.02.14 20:02
Оценка:
Здравствуйте, Хреннос, Вы писали:


Х>Если хотите, чтобы регексп срабатывал от самого начала строки, то надо вставить каретку:

Х>std::regex re ("^(\\d+?),(.*?),(.*?),(.*?),(.*?)$") ;

Спасибо большое!

Я почему то думал что факт того что вначале что-то идет надо оговаривать отдельно, и всегда писал что-то типа:

std::regex re ("[a-z,.]*?(\\d+?),(.*?),(.*?),(.*?),(.*?)$") ;
Re[3]: Почему срабатывает regex ?
От: Хреннос  
Дата: 09.02.14 20:22
Оценка:
Здравствуйте, sjukov, Вы писали:

S>Я почему то думал что факт того что вначале что-то идет надо оговаривать отдельно, и всегда писал что-то типа:

S>std::regex re ("[a-z,.]*?(\\d+?),(.*?),(.*?),(.*?),(.*?)$") ;

Это мысль неверная. В любом учебнике по регекспам (или перлу, который сам один большой регексп) начинают с того, что ищут подстроку в строке. При этом часть строки, не подходящая под регексп, пропускается.
Re: Почему срабатывает regex ?
От: jazzer Россия Skype: enerjazzer
Дата: 10.02.14 08:28
Оценка: 4 (2)
Здравствуйте, 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$)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.