博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ STL之正则表达式
阅读量:4298 次
发布时间:2019-05-27

本文共 3397 字,大约阅读时间需要 11 分钟。

正则表达式是C++11标准库中新加入的强大工具。正则表达式是一种用于字符串处理的微型语言,适用于一些与字符串相关的操作。

C++11包含了对以下几种语法的支持:ECMAScript、basic、extended、awk、grep和egrep。C++11中使用的默认语法是ECMAScript。

匹配

regex_match

regex_match()算法可以用于比较一个给定源字符串和一个正则表达式模式,如果模式匹配整个源字符串,则返回true,否则返回false

#include 
#include
using namespace std;int main() { string str = "sigalhu233"; regex r("[a-z0-9]+"); cout<<"正则表达式:[a-z0-9]+"<

运行结果:

正则表达式:[a-z0-9]+字符串:sigalhu233 匹配成功!正则表达式:\d+字符串:sigalhu233 匹配失败!正则表达式:\d+字符串:233 匹配成功!正则表达式:([a-z]+)(\d+)字符串:hu233 匹配成功!匹配字符串个数:3分别为:hu233 hu 233正则表达式:([a-z]+)(\d+)字符串:sigalhu233 匹配成功!匹配字符串个数:3分别为:sigalhu233 sigalhu 233

查找

regex_search

regex_search()算法可以在输入字符串中提取匹配的子字符串。smatch对象sm将包含搜索结果。如果要获得第一个捕捉组的字符串表达形式,可在代码中编写m[1]m[1].str()。通过查看m[1].firstm[1].second迭代器可以得到这个子字符串在源字符串中出现的准确位置。

#include 
#include
using namespace std;int main() { string str = "sigalhu233sigal233hu233"; smatch sm; cout<<"正则表达式:([a-z]+)2"<

运行结果:

正则表达式:([a-z]+)2字符串:sigalhu233sigal233hu233 匹配成功!匹配字符子串个数:2分别为:sigalhu2 sigalhu字符串 sigalhu2 前的字符串为:字符串 sigalhu2 后的字符串为:33sigal233hu233字符串:33sigal233hu233 匹配成功!匹配字符子串个数:2分别为:sigal2 sigal字符串 sigal2 前的字符串为:33字符串 sigal2 后的字符串为:33hu233字符串:33hu233 匹配成功!匹配字符子串个数:2分别为:hu2 hu字符串 hu2 前的字符串为:33字符串 hu2 后的字符串为:33

regex_iterator

为了逐一迭代正则查找的所有匹配成果,我们也可以使用regex_iterator。一般情况下,需要为某个特定的容器指定一个尾迭代器,但是对于regex_iterator,只有一个end值。只需要通过默认的构造函数声明一个regex_iterator类型,就可以获得这个尾迭代器:这个尾迭代器会被隐式地初始化为end值。

#include 
#include
using namespace std;int main() { string str = "sigalhu233sigal233hu233"; regex reg("([a-z]+)2"); cout<<"正则表达式:([a-z]+)2"<
prefix().first<<" 匹配成功!"<
size()<
str()<<" 前的字符串为:"<
prefix().str()<
str()<<" 后的字符串为:"<
suffix().str()<

运行结果:

正则表达式:([a-z]+)2字符串:sigalhu233sigal233hu233 匹配成功!匹配字符子串个数:2分别为:sigalhu2 sigalhu字符串 sigalhu2 前的字符串为:字符串 sigalhu2 后的字符串为:33sigal233hu233字符串:33sigal233hu233 匹配成功!匹配字符子串个数:2分别为:sigal2 sigal字符串 sigal2 前的字符串为:33字符串 sigal2 后的字符串为:33hu233字符串:33hu233 匹配成功!匹配字符子串个数:2分别为:hu2 hu字符串 hu2 前的字符串为:33字符串 hu2 后的字符串为:33

regex_token_iterator

regex_iterator有助于迭代“匹配合格”的子序列。然而有时候你会想处理那些子序列之间的内容,特别是当你打算将string拆分为一个个语汇单元token或以某个东西分割string,分隔符甚至可能被指定为一个正则表达式。regex_token_iterator就提供了这样的功能。

为了将它初始化,需要传给它字符序列的起点和终点,以及一个正则表达式。此外还可以指明一列整数值,用来表示语汇化过程中的元素:

* -1:表示你对每一个“匹配之正则表达式之间”或“语汇切分器之间”的子序列感兴趣
* 0:表示你对每一个匹配之正则表达式或语汇切分器感兴趣
* 任何其他数字 n :表示你对正则表达式中的第
n
个匹配次表达式感兴趣

#include 
#include
using namespace std;int main() { string str = "11sigalhu233sigal244hu255"; regex reg("([a-z]+)2"); cout<<"正则表达式:([a-z]+)2"<
str()<
str()<
str()<

运行结果:

正则表达式:([a-z]+)2字符串为:11sigalhu233sigal244hu255匹配到的字符串为:sigalhu2匹配到的字符串为:sigal2匹配到的字符串为:hu2匹配到的字符串为:sigalhu匹配到的字符串为:sigal匹配到的字符串为:hu匹配到的字符串为:11匹配到的字符串为:33匹配到的字符串为:44匹配到的字符串为:55

替换

regex_replace

regex_replace()算法要求输入一个正则表达式,以及一个用于替换匹配子字符串的格式化字符串。这个格式化字符串可以通过转义序列引用匹配子字符串中的部分内容。

转义序列 替换为
$n 匹配第n个捕捉组的字符串。例如$l表示第一个捕捉组,$2表示第二个,依此类推
$& 匹配整个正则表达式的字符串,等同于$0
$` 在源字符串中,在匹配正则表达式的子字符串左侧的部分
$’ 在源字符串中,在匹配正则表达式的子字符串右侧的部分
$$ 美元符号
#include 
#include
using namespace std;int main() { string str = "11sigalhu22sigalhu33",str1; str1 = regex_replace(str,regex("s(igal)h(u)"),"SS$1HH$2"); cout<
<

运行结果:

11SSigalHHu22SSigalHHu3311SSigalHHu22SSigalHHu3311SSigalHHu22SSigalHHu3311S11S11SSigalHHu22SSigalHHu33

转载地址:http://fhsws.baihongyu.com/

你可能感兴趣的文章
删远端分支报错remote refs do not exist或git: refusing to delete the current branch解决方法
查看>>
python multiprocessing遇到Can’t pickle instancemethod问题
查看>>
APP真机测试及发布
查看>>
iOS学习之 plist文件的读写
查看>>
通知机制 (Notifications)
查看>>
10 Things You Need To Know About Cocoa Auto Layout
查看>>
C指针声明解读之左右法则
查看>>
一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
查看>>
iOS 如何放大按钮点击热区
查看>>
ios设备唯一标识获取策略
查看>>
获取推送通知的DeviceToken
查看>>
Could not find a storyboard named 'Main' in bundle NSBundle
查看>>
CocoaPods安装和使用教程
查看>>
Beginning Auto Layout Tutorial
查看>>
block使用小结、在arc中使用block、如何防止循环引用
查看>>
iPhone开发学习笔记002——Xib设计UITableViewCell然后动态加载
查看>>
iOS开发中遇到的问题整理 (一)
查看>>
Swift code into Object-C 出现 ***-swift have not found this file 的问题
查看>>
为什么你的App介绍写得像一坨翔?
查看>>
RTImageAssets插件--@3x可自动生成@2x图片
查看>>