C ++ 11 пытается извлечь подстроку с помощью регулярных выражений - PullRequest
0 голосов
/ 14 декабря 2018

Это мое приложение:

// regex_example.cpp:
//  How to compile:
//   $ g++ -std=c++11 regex_example.cpp -o regex_example

#include <iostream>
#include <string>
#include <regex>

int main()
{
  std::string input = "Pizza Carrot Lasagna 15000  ";
  std::smatch match;
  std::regex test_reg("[^0-9]*([0-9]+).*");

  if (std::regex_search(input.begin(), input.end(), match, test_reg))
  {
    std::cout << "This is the string found: " << match[1] << std::endl;
  }

  return 0;
}

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

regex_example.cpp: In function 'int main ()': regex_example.cpp: 24: 68: ошибка: нет соответствующей функции для вызова' regex_search (std :: __ cxx11 :: basic_string :: iterator, std :: __ cxx11 :: basic_string :: iterator, std :: __ cxx11 :: smatch &, std :: __cxx11 :: regex &) 'if (std :: regex_search (input.begin (), input.end (), match, test_reg))

В основном я пытаюсьсделать следующее:

1 - иметь эту компиляцию.Я не понимаю, почему я получаю синтаксическую ошибку.

2 - из входной строки я пытаюсь извлечь число 15000. Я предполагаю, что когда я получу эту компиляцию, яполучите строку 15000.

1 Ответ

0 голосов
/ 14 декабря 2018

Использование

std::regex_search(input.begin(), input.end(), match, test_reg)

Вызывает перегрузку

template< class BidirIt, class Alloc, class CharT, class Traits >
bool regex_search( BidirIt first, BidirIt last,
                   std::match_results<BidirIt,Alloc>& m,
                   const std::basic_regex<CharT,Traits>& e,
                   std::regex_constants::match_flag_type flags = 
                       std::regex_constants::match_default );

и требует, чтобы match_result было std::match_results<BidirIt,Alloc>.В данном случае это std::string::iterator, но match, то есть std::smatch, использует std::string::const_iterator.Поскольку они не совпадают, компилятор не может определить, на что BidirIt должен выводить.

Есть много способов обойти это, но самое простое решение - просто использовать перегрузку std::string, например:

std::regex_search(input, match, test_reg)

( Live Example )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...