Я регулярно ищу файл с помощью cregex_iterator. У меня есть boost::regex_constants::match_partial и boost::regex_constants::match_not_eob, установленные в моих флагах соответствия, и у меня есть $ в конце моего регулярного выражения. Проблема в том, что $ кажется совпадающим с концом буфера. так как я ищу частичные совпадения в конце моего буфера, чтобы облегчить поиск файла, это не работает. Есть ли способ заставить $ не соответствовать концу буфера? Упрощенный тестовый пример ниже...
#include <iostream>
#include <boost/regex.hpp>
const char *buf =
R"V0G0N([2014-04-12 13:01:13.414+0100:0x00000134]: Arbitrary non matching line
[2014-04-12 13:01:14.570+0100:0x00000134]:DBLog: 'Incomplete)V0G0N";
const char *szRegex = "^\\[(.{23})(Z|[+|-][0-9]{2})[0-9x:]{11,13}\\]:DBLog: (.+)$";
int _tmain(int argc, char* argv[])
{
char c;
boost::regex::flag_type regex_flags = boost::regex_constants::normal | boost::regex_constants::perl;
boost::regex_constants::match_flag_type match_flags =
boost::regex_constants::match_default | boost::regex_constants::match_not_dot_newline | boost::regex_constants::format_perl |
boost::regex_constants::match_partial | boost::regex_constants::match_not_eob;
boost::regex pattern(szRegex, regex_flags);
boost::cregex_iterator a(
buf,
buf + strlen(buf),
pattern,
match_flags);
boost::cregex_iterator end;
while (a != end)
{
if ((*a)[0].matched == false)
{
// Partial match, save position and break:
std::cout << "Partial Match: " << std::string((*a)[0].first, (*a)[0].second) << std::endl;
break;
}
else
{
std::cout << "Complete Match: " << std::string((*a)[0].first, (*a)[0].second) << std::endl;
}
// move to next match:
++a;
}
std::cout << "done!" << std::endl;
std::cin >> c;
return 0;
}
приводит к...
Complete Match: [2014-04-12 13:01:14.570+0100:0x00000134]:DBLog: 'Incomplete
Мне нужно, чтобы это рассматривалось как частичное совпадение.