regex_replace使用方法 替换文本
来源:互联网 发布:ssc源码论坛 编辑:程序博客网 时间:2024/06/04 18:15
仔细阅读main 函数皆可以找到精髓,与PHP的替换函数思路不相同。
regex_replace
#include <boost/regex.hpp>
template <class traits, class charT>
basic_string<charT> regex_replace (const basic_string<charT>& s,
const basic_regex<charT, traits>& e,
const basic_string<charT>& fmt,
match_flag_type flags = match_default);
Regex算法家族中的第三个算法是 regex_replace. 顾名思义,它是用于执行文本替换的。它在整个输入数据中进行搜索,查找正则表达式的所有匹配。对于表达式的每一个匹配,该算法调用 match_results::format 并输入结果到一个传入函数的输出迭代器。
我给出了一个例子,将英式拼法的 colour 替换为美式拼法 color. 不使用正则表达式来进行这个拼写更改会非常乏味,也很容易出错。问题是可能存在不同的大小写,而且会有很多单词被影响,如colourize. 要正确地解决这个问题,我们需要把正则表达式分为三个子表达式。
boost::regex reg("(Colo)(u)(r)", boost::regex::icase|boost::regex::perl);
我们将要去掉的字母u独立开,为了在所有匹配中可以很容易地删掉它。另外,注意到这个正则表达式是大小写无关的,我们要把格式标志 boost::regex::icase 传给 regex 的构造函数。你还要传递你想要设置的其它标志。设置标志时一个常见的错误就是忽略了regex缺省打开的那些标志,如果你没有设置这些标志,它们不会打开,你必须设置所有你要打开的标志。
调用 regex_replace时,我们要以参数方式提供一个格式化字符串。该格式化字符串决定如何进行替换。在这个格式化字符串中,你可以引用匹配的子表达式,这正是我们想要的。你想保留第一个和第三个匹配的子表达式,而去掉第二个(u)。表达式 $N表示匹配的子表达式, N 为子表达式索引。因此我们的格式化串应该是 "$1$3", 表示替换文本为第一个和第三个子表达式。通过引用匹配的子表达式,我们可以保留匹配文本中的所有大小写,而如果我们用字符串来作替换文本则不能做到这一点。以下是解决这个问题的完整程序。
#include <iostream>
#include <string>
#include "boost/regex.hpp"
int main()
{
boost::regex reg("(Colo)(u)(r)", boost::regex::icase|boost::regex::perl);
std::string s="Colour, colours, color, colourize";
s=boost::regex_replace(s,reg,"$1$3");
std::cout << s;
}
程序的输出是 "Color, colors, color, colorize". regex_replace 对于这样的文本替换非常有用。
- regex_replace使用方法 替换文本
- boost::regex_replace自定义替换函数用法
- 文本替换
- 文本替换
- 文本替换
- 替换文本
- regex_replace 函数
- 使用regex_replace
- 搜索、替换文本
- SHELL 文本替换
- 文本替换小程序
- sed 文本替换测试
- 文本字符替换
- linux文本替换
- 文本字符串替换
- js 替换文本
- 文本替换java实现
- shell 文本替换命令
- mongodb与mysql相比的优缺点
- 数组
- 计算某日期是一年中的第几天
- PHP中单引号和双引号到底有啥区别
- PHP数组学习
- regex_replace使用方法 替换文本
- SPDA-CNN:Unifying Semantic Part Detectiojn and Abstraction for Fine-grained Recognition
- [Web前端技术教学]网页布局-居中方法小结
- 使用StringBuilder与SqlParameter
- Yii2的安装
- Discuz学习记录:取得所有记录数量的两种方式
- 解决vim粘贴乱码的终极办法
- 深度学习中的初始化
- java基础总结一