正则表达式库组件
regex | 表示一个正则表达式的类 |
regex_match | 将一个字符序列与一个正则表达式匹配 |
regex_search | 寻找第一个与正则表达式匹配的子序列 |
regex_replace | 使用给定格式替换一个正则表达式 |
sregex_iterator | 迭代器适配器,调用regex_search来遍历一个string中所有匹配的字串 |
smatch | 容器类,保存在string中搜索的结果 |
ssub_match | string中匹配的子表达式的结果 |
regex_search与regex_match的参数
(seq, m, r, mft) | 在字符序列seq中查找regex对象r中的正则表达式。seq可以是一个string,表示范围的一对迭代器以级一个指向空字符结尾的字符数组的指针 ;m是一个match对象,用来保存匹配结果的相关细节。m和seq必须具有兼容的类型 |
(seq, r, mft) | mft是一个可选的regex_constants::match_flag_type值。不同的值会影响匹配过程 |
使用正则表达式库
默认情况下,regex使用的正则表达式是ECMAScript。模式[[:alpha:]]匹配任意字母。
http://www.cplusplus.com/reference/regex/ECMAScript/
regex(和wregex)选项
regex r(re) 或 regex(re, f) | re表达一个正则表达式,它可以是一个string,一个表达字符范围的迭代器对,一个指向空字符结尾的字符数组的指针,一个字符指针和一个计数器或是一个花括号包围的字符列表。f是指出对象如何处理的标志。 |
r1=re | 将r1中的正则表达式替换为re。 |
r1.assign(re, f) | 与使用赋值运算符(=)相同;可选的标志f也与regex的构造函数中相同 |
r.mark_count() | r中子表达式的数目 |
r.flags() | 返回r的标志集 |
定义regex时指定的标志
icase | 在匹配过除中忽略大小写 |
nosubs | 不保存匹配的子表达式 |
optimize | 执行速度优先于构造速度 |
ECMAScript | 使用ECMA-262指定的语法 |
basic | 使用POSIX基本的正则表达式语法 |
extended | 使用POSIX拓展的正则表达式语法 |
awk | 使用POSIX版本的wsk语言的语法 |
grep | 使用POSIX版本的grep的语法 |
egrep | 使用POSIX版本的egrep的语法 |
RE库类型必须与输入序列类型匹配。
正则表达式库类
如果输入序列类型 | 则使用正则表达式类 |
---|---|
string | regex, smatch, ssub_match和sregex_iterator |
const char* | regex, cmatch, csub_match和cregex_iterator |
wstring | wregex, wsmatch, wssub_match和wsregex_iterator |
匹配与Regex迭代器类型
sregex_iterator操作(也适用于cregex_iterator, wregex_iterator和wcregex_iterator)
sregex_iterator it(b, e, r); | 一个sregex_iterator,遍历迭代器b和e表示的string。它调用sregex_iterator(b, e, r)将it定位定位到输入中的第一个匹配位置 |
sregex_iterator end; | sregex_iterator的尾后迭代器 |
*it 或 it-> | 根据最后一个调用regex_search的结果,返回一个smatch对象的引用或者一个指向smatch对象的指针 |
++it it++ | 从输入序列当前匹配位置开始调用regex_search。前置版本返回递增后迭代器;后置版本返回旧值 |
smatch操作(也适用于cmatch, wsmatch, wcmatch 和对应csub_match, wssub_match和wcsub_match)
m.ready() | 如果已经通过regex_search或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(…) | |
m.length(n) | 第n个匹配的子表达式的大小 |
m.position(n) | 第n个子表达式距序列开始的距离 |
m.str(n) | 第n个子表达式匹配的string |
m[n] | 对应第n个子表达式的ssub_match对象 |
m.begin(), m.end() m.cbegin(), m.cend() | 表示m中sub_match元素范围的迭代器。与往常一样。cbegin和cend返回const_iterator |
ECMAScript正则表达式的一些语言特性
- \d表示单个数字而{d}{n}则表示一个n个数字的序列。(如:{d}{3}匹配三个数字的序列)
- 在方括号中的字符集合表示匹配这些字符中任意一个。(如:[-. ]匹配一个短横线或一个点或一个空格。注意,点在括号中没有特殊含义)
- 后接’?'的组件是可选的;出现0或1次。(如:{d}{3}[-. ]?{d}{4}匹配这样的序列:开始3个数字,后接一个可选的短横线或点或空格,然后是4个数字)
- 类似c++,ECMAScript使用反斜线表示一个字符本身而不是其特殊含义。由于我们的模式包含括号,而括号是ECMAScript中的特殊字符,因此我们必须用\来表示括号是模式的一部分而不是特殊字符。
使用regex_replace
正则表达式替换操作
m.forat(dest, fmt, mft) | 使用格式字符串fmt生成格式化输出,匹配在m中,可选的match_flag_type标志在mft中。第一个版本写入迭代器dest指向的目的位置并接受fmt参数,可以是一个string,也可以是表示字符字符数组中范围的一对指针。 |
m.forat(fmt, mft) | 第二个版本返回一个string,保存输出,并接受fmt参数,可以是一个string,也可以是一个指向空字符结尾的字符数组的指针。mft的默认值为format_default |
regex_replace(dest, seq, r, fmt, mft) | 遍历seq,用regex_search查找regex对象r匹配的字串。使用格式字符串fmt和可选的match_flag_type标志来生成输出。将输出写入到迭代器dest指定的位置,并接受一对迭代器seq表示范围。 |
regex_replace(seq, r, fmt, mft) | 第二个版本返回一个string,保存输出,且seq既可以是一个string也可以是一个指向空字符结尾的字符数组的指针。在所有情况下,fmt既可以是一个string也可以是一个指向空字符结尾的字符数组的指针,且mft的默认值为match_default |
用来控制匹配和格式的标志
定义在regex_constants::match_flag_type中
match_default | 等价于format_default |
match_not_bol | 不将首字符作为行首处理 |
match_not_eol | 不将尾字符作为行尾处理 |
match_not_bow | 不将首字符作为单词首处理 |
match_not_eow | 不将尾字符作为单词尾处理 |
match_any | 如果存在多于一个匹配,则可返回任意一个匹配 |
match_not_null | 不匹配任何空序列 |
match_continuous | 匹配必须从输入的首字符开始 |
match_prev_avail | 输入序列包含第一个匹配之前的内容 |
format_default | 用ECMAScript规则替换字符串 |
format_sed | 用POSIXsed规则替换字符串 |
format_no_copy | 不输出输入序列中未匹配的部分 |
format_first_only | 只替换子表达式的第一次出现 |