使用Boost替换正则表达式
In-place regex replacement using Boost
我有一段巨大的文本存储在一个名为"text"的std::字符串中。在这个字符串中,我使用boost正则表达式库用空白替换某些模式。这是我的密码。
// Remove times of the form (00:33) and (1:33)
boost::regex rgx("\([0-9.:]*\)");
text = boost::regex_replace(text, rgx, " ");
// Remove single word HTML tags
rgx.set_expression("<[a-zA-Z/]*>");
text = boost::regex_replace(text, rgx, " ");
// Remove comments like [pause], [laugh]
rgx.set_expression("\[[a-zA-Z]* *[a-zA-Z]*\]");
text = boost::regex_replace(text, rgx, " ");
// Remove comments of the form <...>
rgx.set_expression("<.+?>");
text = boost::regex_replace(text, rgx, " ");
// Remove comments of the form {...}
rgx.set_expression("\{.+?\}");
text = boost::regex_replace(text, rgx, " ");
// Remove comments of the form [...]
rgx.set_expression("\[.+?\]");
text = boost::regex_replace(text, rgx, " ");
根据我的理解,每次运行regex_replace函数时,它都会创建一个新的字符串并将输出写入其中。如果我运行具有N种不同模式的regex_replacefunction,它会分配N个新字符串(删除旧字符串)。
由于内存分配很耗时,有没有一种方法可以在不分配新字符串的情况下"就地"执行替换?
regex_replace有两个重载,一个是您现在正在使用的重载,另一个是使用迭代器的重载。您可以将输出迭代器指定为与您正在操作的范围相同的范围
boost::regex_replace(text.begin(), text.begin(), text.end(), rgx,
" ");
由于您的正则表达式替换都不处理先前替换步骤的输出,因此您只需将所有这些正则表达式放入一个更大的正则表达式中,并运行该正则表达式一次。
您甚至可以为每个regex部分指定不同的替换字符串,但这在这里不是必需的。
boost::regex rgx("(\([0-9.:]*\))|"
"(<[a-zA-Z/]*>)|"
"(\[[a-zA-Z]* *[a-zA-Z]*\])|"
"(<.+?>)|"
"(\{.+?\})|"
"(\[.+?\])");
text = boost::regex_replace(text, rgx, " ");
相关文章:
- C++正则表达式替换整个单词
- 用回调函数替换C++正则表达式
- 将一个特定字符替换为正则表达式匹配中的另一个字符
- 对 std::string 执行正则表达式搜索和替换
- Eclipse IDE,正则表达式搜索和替换
- 使用提升C++通过正则表达式替换字符串
- 正则表达式用模式替换模式
- C++11正则表达式:在替换字符串中捕获组后的数字
- C++正则表达式库,替换为函数指针
- Visual Studio正则表达式替换
- C++正则表达式替换第一个匹配项
- 使用正则表达式替换匹配项
- 有没有办法在一次迭代中进行任意数量的正则表达式替换
- 使用正则表达式替换 1 次迭代中的所有匹配项
- 如何使用增强正则表达式替换方法
- C++11 正则表达式替换
- 提高c++正则表达式替换性能
- 正则表达式替换文件扩展名前缀放置不起作用 - 替换匹配项
- 使用Boost c++库将正则表达式替换为自定义替换
- 使用正则表达式替换oracle中特殊字符之间的字符串