C++正则表达式

正则表达式库组件

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

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库类型必须与输入序列类型匹配。
正则表达式库类

如果输入序列类型则使用正则表达式类
stringregex, smatch, ssub_match和sregex_iterator
const char*regex, cmatch, csub_match和cregex_iterator
wstringwregex, 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只替换子表达式的第一次出现
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值