Как использовать результат std::regex_search?

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

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

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

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

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

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 ] ;
}

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

вы просто хотите знать, соответствует ли строка регулярному выражению, или вы хотите искать элементы с помощью регулярного выражения?

OznOg 29.05.2019 20:15

Используйте sregex_token_iterator или sregex_iterator. Исправьте и ваше регулярное выражение, но это не текущая проблема.

Wiktor Stribiżew 29.05.2019 20:19

Моя выкройка отражает именно то, что мне нужно, большое спасибо. Чего я не понимаю, так это того, как я могу «читать» свои снимки в std::smatch m; var.

user9658871 31.05.2019 10:39

@LightnessRacesinOrbit Кажется вероятным. Можете ли вы написать это в ответ, чтобы я принял его? Также будет ли работать, если поставить GetBuffer() вместо GetString()? Хотя я вижу необходимость, мне не нравится использовать всю переменную для одной строки.

user9658871 31.05.2019 17:24

Да, я решил, что это бесполезный обман. Открыл и ответил.

Lightness Races in Orbit 31.05.2019 17:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Другие вопросы по теме