я просто звоню
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 ] ;
}
Не работает по какой-то причине (с ошибкой несовместимого строкового итератора). Там наверняка есть какая-то хитрость. Я позволю тому, кто знает, объяснить это.
Используйте sregex_token_iterator
или sregex_iterator
. Исправьте и ваше регулярное выражение, но это не текущая проблема.
Моя выкройка отражает именно то, что мне нужно, большое спасибо. Чего я не понимаю, так это того, как я могу «читать» свои снимки в std::smatch m;
var.
@LightnessRacesinOrbit Кажется вероятным. Можете ли вы написать это в ответ, чтобы я принял его? Также будет ли работать, если поставить GetBuffer()
вместо GetString()
? Хотя я вижу необходимость, мне не нравится использовать всю переменную для одной строки.
Да, я решил, что это бесполезный обман. Открыл и ответил.
Вы правы, что можете просто назначить совпадение std::string
; вы не имеют, чтобы использовать функцию вставки потока.
Однако ваш третий пример дает сбой, потому что std::smatch
содержит ссылки/дескрипторы позиций в исходных исходных данных… что в вашем аварийном случае является временным strT.GetString()
, которое вышло из области видимости, как только регулярное выражение было выполнено (читайте здесь).
Ваш второй пример правильный.
Я признаю, что реализация регулярных выражений C++ на первый взгляд не совсем интуитивна.
вы просто хотите знать, соответствует ли строка регулярному выражению, или вы хотите искать элементы с помощью регулярного выражения?