C++ 正则表达式库-RE

目录

1、组件

2、regex

2.1、regex可选标志

3、regex_match和regex_search

3.1、参数

3.2、match_flag_type标志

4、regex迭代器

5、smatch操作

5.1、ssub_match

6、regex_replace

7、正则表达式库类

8、正则表达式错误类型


1、组件

正则表达式库组件如下表所示(定义在regex中)。

regex表示一个正则表达式的类
regex_match将一个字符序列与一个正则表达式匹配
regex_search寻找第一个与正则表达式匹配的子序列
regex_replace使用给定格式替换一个正则表达式
sregex_iterator迭代器适配器。
smatch容器类,保存在string中的搜索结果
ssub_matchstring中匹配的子表达式的结果

2、regex

regex r(re)

re表示一个正则表达式,它可以是string、表示字符范围的迭代器对、指向空字符结尾的字符数组的指针、字符指针、花括号包围的字符列表。


f的可选值(如果未指定f,其默认值为ECMAScript)。

regex r(re,f)
r1 = re将r1中的正则表达式替换为re,re表示一个正则表达式。
r1.assign(re,f)与使用赋值运算符(=)效果相同
r.mark_count()r中表达式的数目
r.flags()返回r的标志集

2.1、regex可选标志

标志说明
icase在匹配过程中忽略大小写
nosubs不保存匹配的子表达式
optimize执行速度优先于构造速度
下面六个标志必须设置其中一个,且只能设置一个
ECMAScript使用ECMA-262指定的语法
basic使用POSIX基本的正则表达式语法
extended使用POSIX扩展的正则表达式语法
awk使用POSIX版本的awk语言的语法
grep使用POSIX版本的grep的语法
egrep使用POSIX版本的egrep的语法

函数regex_match和regex_search确定一个给定字符序列与一个给定regex是否匹配。如果整个输入序列与表达式匹配,则regex_match函数返回true;如果输入序列中的一个子串与表达式匹配,则regex_search函数返回true。

regex_match将一个字符序列与一个正则表达式匹配确定一个给定字符序列与一个给定regex是否匹配。若整个输入序列与表达式匹配,则返回true。
regex_search寻找第一个与正则表达式匹配的子序列

确定一个给定字符序列与一个给定regex是否匹配。若输入序列中一个子串与表达式匹配,则返回true。

注:regex_search在输入序列中只要找到一个匹配的子串就会停止查找。

3.1、参数

(seq,m,r,mft)

在seq中查找regex对象r中的正则表达式。

seq可以是string、表示范围的一对迭代器以及一个C风格字符串指针。

m是一个match对象,用于保存匹配结果的相关细节。m和seq必须具有兼容的类型。

mft是一个可选的regex_constants::match_flag_type值,其会影响匹配过程。

(seq,r,mft)

3.2、match_flag_type标志

定义在std::regex_constants::match_flag_type中。

using namespace std::regex_constants;
标志说明
match_default等价于format_default
match_not_bol不将首字符作为行首处理
match_not_eol不将尾字符作为行尾处理
match_not_bow不将首字符作为单词首处理
match_not_eow不将尾字符作为单词尾处理
match_any如果存在多于一个匹配,则可返回任意一个匹配
match_not_null不匹配任何空序列
match_continuous匹配必须从输入的首字符开始
match_pre_avail输入序列包含第一个匹配之前的内容
format_default用ECMAScript规则替换字符串
format_sed用POSIX sed规则替换字符串
format_no_copy不输入序列中未匹配的部分
format_first_only只替换子表达式的第一次出现

4、regex迭代器

当将sregex_iterator绑定到一个string和一个regex对象时,迭代器自动定位到给定string中第一个匹配位置。即,sregex_iterator构造函数对给定string和regex调用regex_serach。

当解引用迭代器时,会得到一个对应最近一次搜索结果的smatch对象。

当递增迭代器时,它调用regex_serach在输入string中查找下一个匹配。

sregex_iterator it(b,e,r);遍历迭代器b和e表示的string。它调用sregex_search(b,e,r)将it定位到输入中第一个匹配的位置
sregex_iterator end;sregex_iterator的尾后迭代器。
*it根据最后一个调用regex_search结果,返回一个smatch对象的引用或一个指向smatch对象的指针
it->
++it

从输入序列当前匹配位置开始调用regex_search.

前置版本返回递增后迭代器;后置版本返回旧值。

it++
it1 ==it2如果两个sregex_iterator都是尾后迭代器,则它们相等。两个非尾后迭代器是从相同的输入序列和regex对象构造,则它们相等
it1 != it2

5、smatch操作

操作说明
m.ready()如果已经通过regex_serach或regex_match设置了m,则返回true;否则返回false。如果ready返回false,则对m进行操作是未定义的。
m.size()如果匹配失败,则返回0;否则返回最近一次匹配的正则表达式中子表达式的数目
m.empty()若m.size()为0,则返回true
m.prefix()一个ssub_match对象,表示当前匹配之前的序列
m.suffix()一个ssub_match对象,表示当前匹配之后的序列
m.format(...)

格式化。用一个中括号里面跟符号$和子表达式的索引号来表示一个特定的子表达式,如[$1]表示子表达式1。

在接受一个索引的操作中,n的默认值为0且必须小于m.size()。第一个子匹配(索引为0)表示整个匹配

m.length(n)第n个匹配的子表达式的大小
m.position(n)第n个子表达式距序列开始的距离
m.str(n)第n个子表达式匹配的string
m[n]对应第n个子表达式的ssub_match对象
m.begin(),m.end()表示m中sub_match元素范围的迭代器。
m.cbegin(),m.cend()返回const_iterator

5.1、ssub_match

matchedpublic bool数据成员,指出此ssub_match是否匹配了
first

public数据成员,指向匹配序列首元素和尾后位置的迭代器。

如果未匹配,则first和second是相等的。

second
length()

匹配的大小。

如果matched为false,则返回0。

str()

返回一个包含输入中匹配部分的string。

如果matched为false,则返回空string。

s = ssub

将ssub_match对象ssub转化为string对象s。等价于s=ssub.str()。

注:转换运算符不是explicit的。

6、regex_replace

m.format(dest,fmt,mft)

使用格式字符串fmt生成格式化输出,匹配在m中。

第一个版本写入到迭代器dest指向的目标位置。第二个版本返回一个string,保存输出。

seq可以是string或指向空字符结尾的字符数组的指针。

fmt可以是string或指向空字符结尾的字符数组的指针。

mft默认值为match_default。

m.format(fmt,mft)
regex_replace(dest,seq,r,fmt,mft)

遍历seq,用regex_search查找与regex对象r匹配的子串,使用格式字符串fmt和可选的match_flag_type标志来生成输出。

第一个版本将输出写入到迭代器dest指定的位置。第二个版本返回一个string,保存输出。

seq可以是string或指向空字符结尾的字符数组的指针。

fmt可以是string或指向空字符结尾的字符数组的指针。

mft默认值为match_default。

regex_replace(seq,r,fmt,mft)

用一个符号$后跟子表达式的索引号来表示一个特定的子表达式。

7、正则表达式库类

使用的RE库类型必须与输入序列类型匹配。 

输入序列类型正则表达式类
stringregex、smatch、ssub_match和sregex_iterator
const char*regex、cmatch、csub_match和cregex_iterator
wstringwregex、wsmatch、wssub_match和wsregex_iterator
const wchar_t*wregex、wcmatch、wcsub_match和wcregex_iterator

8、正则表达式错误类型

一个正则表达式的语法是否正确是在运行时解析的。如果编写的正则表达式存在错误,则在运行时标准库会抛出一个类型为regex_error的异常。regex_error有一个what操作来描述发生了什么错误,其中有一个code的成员,用来返回某个错误类型对应的数值编码。

定义在regex和regex_constants::error_type中
错误类型说明
error_collate无效的元素校对请求
error_ctype无效的字符类
error_escape无效的转义字符或无效的尾置转义
error_backref无效的向后引用
error_brack不匹配的方括号([或])
error_paren不匹配的小括号((或))
error_brace不匹配的花括号({或})
error_badbrace{}中无效的范围
error_range无效的字符范围(如[z-a])
error_space内存不足,无法处理此正则表达式
error_badrepeat重复字符(*、?、+或{)之前没有有效的正则表达式
error_complexity要求的匹配过于复杂
error_stack栈空间不足,无法处理匹配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值