C++正则表达式

  • 表达式:

    • 一般字符:可匹配目标序列中相同的字符
    • 通配符 . :可匹配目标序列中除了换行符外的任何字符
    • [expr]形式表达式: 可以匹配目标序列中包含在表达式expr定义集内的字符或者排序规则表达式,采用 [^**expr],**可匹配目标序列中未包含在表达式expr定义集中的字符或排序规则。
      • 单个字符 : 如 [A] 匹配 A。

      • ch1 - ch2形式的字符域: 如 [A-F]匹配大写A到F中的任何一字母。

      • **[:name:]形式字符类: [[ :alpha:]]**匹配一个字母(不区分大小写)。

        字符类名 说明
        alnum 字母(不区分大小写)和数字
        alpha 字母(不区分大小写)
        blank 空格或制表符
        cntrl 文件格式转义字符
        digit 数字
        graph 字母(不区分大小写) 、数字、英文标点
        lower 小写字母
        upper 大写字母
        print 字母(不区分大小写)、数字、英文标点和空格
        punct 英文标点
        space 空格
        xdigit 表示十六进制字符(abcdefABCDEF)
        d 与digit相同
        s 与space相同
        w 与alnum相同
    • 定位点:定位点**^匹配目标序列的开头,$**可匹配目标序列的末尾。定点可匹配目标字符串的位置,而不匹配字符。
    • 转义序列:
      • 文件格式转移:
        • \、\f、\n、\r、\t 和 \v 分别表示匹配目标序列中的反斜杠、换页符、回车符、水平制表符和垂直制表符

        • DSW字符转义:

          转义序列 等效命名类 默认命名类
          \d [ [:d:] ] [[:digit:]]
          \D [^[: D : ]] [^[: digit :]]
          \s [[: s :]] [[: space :]]
          \S [^[: S :]] [^[: space :]]
          \w [[: w :]] [a-zA-Z0-9]
          \W [^[: W :]] [^a-zA-Z0-9 ]
        • 8进制数转义: \ooo, ‘ooo’表示三位八进制数目,如\101匹配字符A

        • 16进制转义: \xhh , “hh”表示两位十六进制, 如\x41 匹配字符A

        • Unicode转义: \uhhhh, “hhhh”表示思维十六进制数,如\u0041匹配字符A

  • 量词:

    • 指定要匹配的表达式出现的次数,如:x{1,1}表示必须匹配一个x,x{1,3}可以匹配1-3个x。
    量词 含义
    E? 匹配0次或者1次E(表达式),等价于E{0,1}
    E+ 至少匹配一次E,等价于E{1,}
    E* 匹配0次或者多次E,等价于E{0,}
    E{n} 匹配n次E,等价于E{n,n}
    E{n, } 至少匹配n次E
    E{, n} 至多匹配n次E
    E{n,m} 至少匹配n次。至多匹配m次

    例如:[A-C]+ 可以匹配“AAA”, “C”

  • 断言

    断言 含义
    \b 一个单词的边界
    \B 一个非单词的边界
    (?=E) 表达式后面紧跟着E才匹配成功,但不会改名目标序列中匹配的位置
    (?!E) 表达式后面紧跟着E才匹配成功,但不会改名目标序列中匹配的位置
    (?:E)

    例如:\bmail\b 匹配就是一个单词mail,This is a T(?!est):如果T后面没有est就匹配,主要用于替换, This is a T(?=est) 表示如果T 后面有est 就匹配,这主要用于替换

  • 实例

    在C++中正则表达式需要用到regex库:常用函数:

    函数名称 解释
    regex_match 将一个字符序列与正则表达式进行匹配
    regex_search 查找字符序列中与正则表达式匹配的结果,找到第一个之后就会返回结果并停止查找
    regex_replace 替换字符到正则表达式匹配到字符序列的位置。
    1. 检验邮箱格式:

      邮箱的一般格式:xxx@xxx.com,验证 xxx@163.com 格式的邮箱。

      正则表达式:[[:graph:]]+@163[.]com,这里将.用方括号括起来是因为.在正在表达式中是一个通配符。

      #include <iostream>
      #include <regex>
      
      using namespace std;
      
      int main() {
             
      	string re = "[[:graph:]]+@163[.]com";
      	regex rule(re);
      	string str = "acvds.cpp@163.com";
      	cout << regex_match(str, rule) << endl;    //1
      	cout << regex_replace(str, rule,"ok") << endl;    //ok
      
      	return 0;
      }
      
      #include <regex>
      #include <iostream>
      using namespace std;
      
      int main()
      {
             
          string re = "E(?!xpression)[a-z]{0,}";
          regex rule(re);
          string str = "Regular E E E";
          cout << regex_replace(str, rule, "Expression") << endl; 
      		//Regular Expression Expression Expression
          system("pause");
          return 0;
      }
      
      #include <iostream>
      #include <regex>
      using namespace std;
      int main() {
             
          string str = "Hello 2019, Bye 2018";
          smatch result;
          regex pattern("\\d{4}");	//匹配四个数字
      
          //迭代器声明
          string::const_iterator iterStart = str.begin();
          string::const_iterator iterEnd = str.end();
          string temp;
          while (regex_search(iterStart, iterEnd, result, pattern))
          {
             
              temp = result[0];
              cout << temp << " ";
              iterStart = result[0].second;	//更新搜索起始位置,搜索剩下的字符串
          }
          cout << endl;
          return 0;
      }