Как использовать результат std :: regex_search? - PullRequest
1 голос
/ 29 мая 2019

Я просто звоню

std::smatch m;
if (std::regex_search 
  (std::string (strT.GetString ()), 
  m,
  std::regex ("((\\d[\\s_\\-.]*){10,13})")))
{
  ...
}

Не могу на всю жизнь понять, как извлечь совпадающие значения из m.

КАЖДУЮ ОДНУЮ страницу на тему пишетэто кутать, что для меня ничего не стоит.Я просто хочу получить то, что было записано в строке, но независимо от того, что я пытаюсь сделать, это вылетает с сообщением об ошибке «несовместимые строковые итераторы».

ОК, поэтому я попробовал еще несколько вещей и был сильно раздраженболее подробно о том, как работает тот же код в онлайн-тестерах, но не на моем компьютере.Я дошел до этой

std::string s (strT.GetString ()) ;
std::smatch m;
if (std::regex_search (
    s, 
    m,
    std::regex ("((\\d[\\s_\\-.]*){10,13})")))
{
    std::string v = m[ 0 ] ;
}

работы, но эта

std::smatch m;
if (std::regex_search (
    std::string (strT.GetString ()), 
    m,
    std::regex ("((\\d[\\s_\\-.]*){10,13})")))
{
    std::string v = m[ 0 ] ;
}

не работает по какой-то причине (с несовместимой ошибкой итератора строки).Там наверняка есть какая-то хитрость.Я позволю тому, кто знает, объяснить это.

1 Ответ

1 голос
/ 31 мая 2019

Вы правы, что можете просто назначить совпадение для std::string; у вас нет для использования функции вставки потока.

Однако ваш третий пример дает сбой, потому что std::smatch содержит ссылки / указатели на позиции в исходных данных источника & hellip; который в вашем аварийном случае является временным strT.GetString(), который вышел из области видимости, как только было выполнено регулярное выражение (см. здесь ).

Ваш второй пример верен.

Я допускаю, что реализация регулярных выражений в C ++ на первый взгляд не совсем интуитивна.

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