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

0 0
原创粉丝点击