从std::regex_search中获取迭代器,并在string::replace中使用。

问题描述 投票:0回答:1

我在匹配一个regex并将其替换为另一个字符串时遇到了可笑的困难。我想用迭代器来实现这个目标,如下所述。不起作用的部分是得到迭代器,这些迭代器可以在原始字符串中限定匹配的范围,然后我可以将其传递给string::replace。我试着使用std::match_results对象来获取一对迭代器,但替换了 mmr 调用regex_search时失败。

我隐隐约约地感觉到,我要么使用了错误的匹配类,要么使用了错误的迭代器类型,但不知何故,我无法从模板丛林中找到出路。

std::string txt{ "aaa bbb" };
std::smatch m;
std::regex rx(R"(aaa)");
std::match_results<std::string::iterator> mr;

if (std::regex_search(cbegin(txt), cend(txt), m, rx)) {
    std::cerr << m[0] << std::endl;

    // what I need here are iterators that I can pass
    // to string::replace

    // txt.replace(i1 ,i2, std::string("ccc"));
}
regex string stl iterator c++17
1个回答
1
投票

试试这个部分

std::string::const_iterator start = txt.begin();
std::string::const_iterator end   = txt.end();

if ( std::regex_search( start, end, m, rx ) ) 

在while循环中的典型应用

while ( std::regex_search( start, end, m, rx ) )
{
    // do stuff with match
    start = m[0].second;
}

1
投票

感谢@Edward,我意识到m[0]包含一对定义匹配子串的迭代器。我曾尝试过第一和第二迭代,但在m上而不是在m[0]上,当然失败了。

有了这个,替换就很容易了。

std::string txt{ "aaa bbb" };
std::smatch m;
std::regex rx(R"(aaa)");

if (std::regex_search(cbegin(txt), cend(txt), m, rx)) {
    txt.replace(m[0].first, m[0].second, std::string("ccc"));
}

0
投票

为什么要用迭代器来替换? 你可能知道这个,但有 std::regex_replace 方法可以做到这一点。

std::string stringText{ "aaa bbb" };
std::regex regexMatch("aaa");
std::string stringResult;

std::regex_replace(std::back_inserter(stringResult), std::cbegin(stringText), std::cend(stringText), regexMatch, "ccc");

另一个类似的例子来自于一个使用了 regex_replace 下卷

它可以使用迭代器,但你需要从当前建立一个新的字符串,如果你想,我可以做一个例子。

© www.soinside.com 2019 - 2024. All rights reserved.