【发布时间】:2017-02-11 05:40:33
【问题描述】:
我有一个模式 '"XYZ\d\d' 和一个 'largeish' 字符串,这种模式可以多次出现。
我的目标是在字符串中找到该模式的所有实例,然后将匹配中的所有字符替换为原始字符串中的字母“A”。
到目前为止,我得到了以下信息,但是有一个错误:
#include <iostream>
#include <regex>
int main() {
std::regex exp("XYZ\\d\\d");
std::smatch res;
std::string str = " XYZ111 d-dxxxxxxx XYZ222 t-nyyyyyyyyy XYZ333 t-r ";
auto itr = str.cbegin();
while (std::regex_search(itr, str.cend(), res, exp)) {
std::cout << "[" << res[0] << "]" << std::endl;
for (auto j = res[0].first; j != res[0].second; ++j) {
*j = 'A'; // Error as dereferencing j causes a const reference
}
itr += res.position() + res.length();
}
std::cout << std::endl;
std::cout << "mod: " << str << std::endl;
return 0;
}
我不确定在使用 C++11 regex 工具来完成我的任务时正确的过程是什么。
还想知道是否有像 regex_replace 这样的东西,它需要一个 functor,人们可以在其中指定他们希望如何在每次匹配发生时更改匹配?
【问题讨论】:
-
搜索
"XYZ",然后判断后面是否跟两位数,大概只需要三行代码。对于这样一个简单的匹配,使用正则表达式似乎有点过头了。
标签: c++ regex string c++11 search