C++与正则表达式入门 (2)

例如,下图是我的Visual Studio编译器,在搜索替换文本的时候,可以使用正则表达式,这时搜索的能力就更加强大了。“Find:”部分可以通过正则表达式来描述待替换的字符串,“Replace:”部分填写替换的字符串。

image-20200723135813276

下面是在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字符串  

这些字符并不少,刚开始接触可能记不住,但随着下文的讲解,相信你会逐渐熟悉它们。

字符类

字符类,顾名思义:是对字符的分类。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssgxf.html