正则表达式
正则表达式是一个用于表示特定规则的字符串,程序中通常使用模式来表示
一个正则表达式代表了符合这个模式的所有字符串
字符
正则表达式中包含元字符与字面字符
字面字符
纯由字面字符组成的正则表达式,用于查找字符串中是否包含该字符串
regex: cat
test: where’s my cat
转义符
若想表示元字符或特殊字符,需要在前面加上转义符
regex: 1\+2=\?
test: result: 1+2=?
字符集合
用方括号表示一个字符集合,表示方括号中字符的任意一个字符
对于连续的字符可以使用-来表示
快捷表示方式:(若对以下字母大写则表示对应集合的补集)
\d表示阿拉伯数字集合,等价于[0-9]\w表示单词字符集合,等价于[a-zA-Z0-9_]\s表示空白字符集合,等价于[\r\n\t\f\v].代表换行符以外的任意字符
regex: [abcde]
test: this is a test
regex: [a-e1-3]
test: abcdefg12345
重复
也可以使用大括号指定重复的次数
如{2}表示重复两次,{2,}表示重复至少两次,{3-5}表示重复3-5次
对于字符集合的重复,只要求字符属于这个集合,而不是重复相同字符
regex: dog* 表示do与0到多个g
test: do dog dogg doggg
regex: #[\da-f]+
表示以#开头,中间为阿拉伯数字或a-f的字母,且至少出现一次的字符集合
test: The RGB code of pink color is #ffc0cb
regex: \w{3-5}
表示由单词字符组成,长度在3-5之间的字符集合
test: It is very impor tant
单词边界符
,存在于单词于非单词字符间以及开头结尾
regex: \b\w{3-5}\b
表示由单词字符组成,长度在3-5之间的单词
test: It is very important
插入符
^是插入符
- 跟在[后,表示取反,如
[^0-9]表示非数字字符 - 当不在[后面,表示一行的起始位置,如
^he\w*\b表示以he在一行开头的单词
结尾符
$是结尾符,表示一行的结尾
如pdf$表示以pdf结尾,如a.pdf,但a.pdf.doc不可以
分组
()用于分组,作用
- 将一个表达式看作一个整体
- 对分组中表达式中匹配结果在后续进行引用,或在程序中获取每个分组的匹配结果
其中,(?:)表示这是一个非捕获分组,不能后续引用或获得匹配结果
如(dog)+ 表示dog连续出现至少1次 如dogdog dog
可选项
|表示可选项,常与小括号分组结合使用
如(dog|cat)-\1 表示捕获的第一个分组为dog或cat 如dog-dog
cat-cat
零宽断言
- 正向先行断言:
(?=表达式),用于匹配后面跟着特定表达式的语句 - 负向先行断言:
(?!表达式),用于匹配不在特定表达式之前的字符串 - 正向后行断言:
(?<=表达式),用于匹配出现在特定表达式之后的表达式 - 负向后行断言:
(?<!表达式),用于匹配不在特定表达式之后的字符串
C++标准库regex
C++中正则表达式位于<regex>库中
使用std::regex 名称(字符串)来初始化一个正则表达式
注意:转义符++中还需要再转义一次
或者使用原始字符串字面值R"(字符串)",转义字符不起作用
- 使用
regex_match(检查字符串, 匹配结果, 正则表达式)判断是否完整匹配正则表达式
返回true则表示匹配,结果存放在匹配结果中,下标0为完整结果,下标1为第一个分组,以此类推
使用
regex_search查找第一个匹配值,使用方法与match一致使用
sregex_iterator(起始位置, 结束位置, 正则表达式)查找所有匹配值,并将结果存储到smatch对象中,调用size()获得匹配数量,str(i)获得第i个匹配项,position(i)获得匹配项的位置,length(i)获得匹配项的长度使用
regex_replace(待替换字符, 正则表达式, 用于替换的格式字符串)符合表达式的进行替换,使用$+数字作占位符,$0表示完整匹配结果,$1表示第一个分组,以此类推