微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++正则表达式

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 替换字符到正则表达式匹配到字符序列的位置。
    @H_958_404@
  • 检验邮箱格式:

    邮箱的一般格式:[email protected],验证 [email protected] 格式的邮箱。

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

    #include <iostream>
    #include <regex>
    
    using namespace std;
    
    int main() {
    	string re = "[[:graph:]]+@163[.]com";
    	regex rule(re);
    	string str = "[email protected]";
    	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, "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;
    }
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐