2015-04-30 1 views
1

Я компиляции следующий код с VS2013:VS2013, regex. Почему я получаю «итераторы строк несовместимыми»?

if (std::regex_match(string("10-11-1982 11:22:31"), match, std::regex("(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2}:\\d{2})"))) { 
      std::cout << "Match size:" << match.size() << std::endl; 
      for (size_t i = 0; i < match.size(); ++i) { 
       std::ssub_match sub_match = match[i]; 
       std::string piece = sub_match.str(); // <-- Interrumption here 
       std::cout << " submatch " << i << ": " << piece << '\n'; 
      } 
     } 

Когда комментировал линия выполнена появится следующее диалоговое окно:

enter image description here

Что случилось с моим кодом?

ответ

1

Вы не можете использовать string, хотя компилятор говорит, что все в порядке.

Просто объявите введенную строку как string, а затем передайте переменную методу regex_match.

Это работает:

string line1 = "10-11-1982 11:22:31"; 

if (std::regex_match(line1, match, std::regex("(\\d{2}-\\d{2}-\\d{4} \\d{2}:\\d{2}:\\d{2})"))) { 
     std::cout << "Match size:" << match.size() << std::endl; 
     for (size_t i = 0; i < match.size(); ++i) { 
      std::ssub_match sub_match = match[i]; 
      std::string piece = sub_match.str(); // <-- Interrumption here 
      std::cout << " submatch " << i << ": " << piece << '\n'; 
     } 
    } 

Выход:

enter image description here

+0

Спасибо. Кстати, почему есть 2 матча? –

+1

Есть две группы, возвращающие соответствие регулярному выражению: 0-я группа, равная целой подстроке, а первая - подстрока, скопированная скобкой части вашего шаблона (вы устанавливаете его на все соответствие). Я думаю, что в этом случае группа захвата является избыточной, удалите круглые скобки. –

Смежные вопросы