【C++】正则表达式

  • ~1.90K 字
  1. 1. 正则表达式
    1. 1.1. 字符
      1. 1.1.1. 字面字符
      2. 1.1.2. 转义符
      3. 1.1.3. 字符集合
      4. 1.1.4. 重复
      5. 1.1.5. 单词边界符
      6. 1.1.6. 插入符
      7. 1.1.7. 结尾符
      8. 1.1.8. 分组
      9. 1.1.9. 可选项
      10. 1.1.10. 零宽断言
    2. 1.2. C++标准库regex

正则表达式

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

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

字符

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

字面字符

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

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

赞助喵
非常感谢您的喜欢!
赞助喵