regex_replace使用方法 替换文本

仔细阅读main 函数皆可以找到精髓,与PHP的替换函数思路不相同。

regex_replace
 
 #include

 
template


basic_string regex_replace (const basic_string& s,
 
                                   const basic_regex& e,

 
                                   const basic_string& 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
 
#include
 
#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 对于这样的文本替换非常有用。
 

你可能感兴趣的:(CPP)