红魔咖啡馆

头发越掉越多,头发越掉越少

0%

【C++】正则表达式

正则表达式

正则表达式是一个用于表示特定规则的字符串,程序中通常使用模式来表示

一个正则表达式代表了符合这个模式的所有字符串

字符

正则表达式中包含元字符与字面字符

字面字符

纯由字面字符组成的正则表达式,用于查找字符串中是否包含该字符串

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表示第一个分组,以此类推