目录
1、组件
正则表达式库组件如下表所示(定义在regex中)。
regex | 表示一个正则表达式的类 |
regex_match | 将一个字符序列与一个正则表达式匹配 |
regex_search | 寻找第一个与正则表达式匹配的子序列 |
regex_replace | 使用给定格式替换一个正则表达式 |
sregex_iterator | 迭代器适配器。 |
smatch | 容器类,保存在string中的搜索结果 |
ssub_match | string中匹配的子表达式的结果 |
2、regex
regex r(re) | re表示一个正则表达式,它可以是string、表示字符范围的迭代器对、指向空字符结尾的字符数组的指针、字符指针、花括号包围的字符列表。
|
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的语法 |
3、regex_match和regex_search
函数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
matched | public 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库类型必须与输入序列类型匹配。
输入序列类型 | 正则表达式类 |
string | regex、smatch、ssub_match和sregex_iterator |
const char* | regex、cmatch、csub_match和cregex_iterator |
wstring | wregex、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 | 栈空间不足,无法处理匹配 |