例如,下图是我的Visual Studio编译器,在搜索替换文本的时候,可以使用正则表达式,这时搜索的能力就更加强大了。“Find:”部分可以通过正则表达式来描述待替换的字符串,“Replace:”部分填写替换的字符串。
下面是在C++中使用正则表达式完成字符串替换的代码示例:
string s = "ab123cdef"; // ① regex ex("\\d+"); // ② string r = regex_replace(s, ex, "xxx"); // ③ cout << r << endl; // ④仍然是前面这个字符串
仍然是同样的正则表达式
通过regex_replace完成替换
通过cout输出结果
最终输出的字符串如下:
abxxxcdef通过上面的三个示例我们看到,regex_match,regex_search和regex_replace三个函数是正则表达式的核心,它们会运行正则表达式引擎完成匹配,查找和替换任务。
正则表达式文法 文法C++中内置了多种正则表达式文法,在创建正则表达式的时候可以通过参数来选择。
文法 说明ECMAScript ECMAScript正则表达式语法,默认选项
basic
extended
awk
grep grep工具的正则表达式语法
egrep
不同的文法在表达上有一些不同,如果你原先已经很熟悉awk或者egrep文法的正则表达式,你可以直接使用它们。对于其他人来说,我们直接使用默认的ECMAScript文法即可(Javascript的正则表达式也是使用ECMAScript文法)。
grep的全称是Global Regular Expression Print。这个名字是在提示我们,它本身与正则表达式的历史有着特定的联系。
C++ 中的 ECMAScript 正则表达式文法是 ,你可以点击链接查看详细内容。
下文中,将会 引用 保罗的酒吧:关于正则表达式的解释。
Raw string literal (原始字符串)在代码中写字符串有时候是比较麻烦的,因为很多字符需要通过反斜杠转义。当有多个反斜杠连在一起时,就很容易写错或者理解错了。
当通过字符串来写正则表达式时,这个问题就更严重了。因为正则表达式本身也有一些字符需要转义。例如,对于这样一个字符串 "('(?:[^\\\\']|\\\\.)*'|\"(?:[^\\\\\"]|\\\\.)*\")|" 大部分人恐怕很难一眼看出其含义了。
在正则表达式很复杂的时候,推荐大家使用 Raw string literal 来表达。这种表达式是告诉编译器:这里的内容是纯字符串,因此不再需要增加反斜杠来转义特殊字符。
Raw string literal 的格式如下:
R"delimiter(raw_characters)delimiter"这其中:
delimiter是可选的分隔符,通常不用写
raw_characters是具体的字符串
也就是说,R"(content)"中的content是你需要的字符串本身。
下面是一个代码示例:
string s = R"("\w\\w\\\w)"; cout << s << endl;它将输出:
"\w\\w\\\w可以看到,这里的双引号和反斜杠不会被解释成转义字符,而是当成字符串内容本身,因此会原样输出。这样就减少了转义字符的复杂度,于是更容易理解了。
特殊字符正则表达式本身定义了一些特殊的字符,这些字符有着特殊的含义。它们如下表所示。
字符 说明. 匹配任意字符
[ 字符类的开始
] 字符类的结束
{ 量词重复数开始
} 量词重复数结束
( 分组开始
) 分组结束
\ 转义字符
\ 转义字符自身
* 量词,0个或者多个
+ 量词,1个或者多个
? 量词,0个或者1个
| 或
^ 行开始;否定
$ 行结束
\n 换行
\t Tab符
\xhh hh表示两位十六进展表示的Unicode字符
\xhhhh hhhh表示四位十六进制表示的Unicode字符串
这些字符并不少,刚开始接触可能记不住,但随着下文的讲解,相信你会逐渐熟悉它们。
字符类字符类,顾名思义:是对字符的分类。