zoukankan      html  css  js  c++  java
  • 【正则表达式1】C++11正则表达式

    头文件

    #include <regex>

    regex_match:整个字符串是否匹配

        regex reg1("\w+day");
        string s1 = "saturday";
        string s2 = "saturday and sunday";
        smatch r1;
        smatch r2;
        cout << boolalpha << regex_match(s1, r1, reg1) << endl;  //true
        cout << boolalpha << regex_match(s2, r2, reg1) << endl;  //false
        cout << "s1匹配结果:" << r1.str() << endl;          //saturday
        cout << "s2匹配结果:" << r2.str() << endl;          //空
        cout << endl;

    regex_match:只返回第一个匹配结果

        smatch rr1;
        smatch rr2;
        cout << boolalpha << regex_search(s1, rr1, reg1) << endl;  //true
        cout << "s1匹配结果:" << rr1.str() << endl;           //saturday
        cout << boolalpha << regex_search(s2, rr2, reg1) << endl;  //true
        cout << "s1匹配结果:" << rr2.str() << endl;           //saturday
        cout << endl;

    iterator:返回多个匹配结果

    类似于指针,调用成员要用"->"

        cout << "iterator结果:" << endl;
        sregex_iterator it(s2.begin(), s2.end(), reg1);
        sregex_iterator end;
        for(; it != end; ++it)
        {
            cout << it->str() << endl;
            //cout << *it << endl; 错误
        }
    
        cout << "token_iterator结果:" << endl;
        sregex_token_iterator tit(s2.begin(), s2.end(), reg1);
        sregex_token_iterator tend;
        for(; tit != tend; ++tit)
        {
            cout << tit->str() << endl;
            cout << *tit << endl;
        }

    子表达式匹配

        regex reg2("(\d{1,3}):(\d{1,3}):(\d{1,3}):(\d{1,3})");
        string ip = "0:11:222:333";
        smatch m; 
        regex_match(ip, m, reg2);
        cout << "输出:str()" << endl;
        cout << m.str() << endl;   //0:11:222:333
        cout << m.str(1) << endl;  //0
        cout << m.str(2) << endl;  //11
        cout << m.str(3) << endl;  //222
        cout << m.str(4) << endl;  //333
    
        cout << "输出:[i]" << endl; //结果同上
        cout << m[0] << endl;
        cout << m[1] << endl;
        cout << m[2] << endl;
        cout << m[3] << endl;
        cout << m[4] << endl;

    多个匹配结果

        string ip2 = "0:11:222:333 4:55:66:7";
        sregex_iterator ip_it(ip2.begin(), ip2.end(), reg2);
        sregex_iterator ip_end;
        for(; ip_it != ip_end; ++ip_it)
        {
            cout << ip_it->str() << endl;
            cout << ip_it->str(1) << endl;
            cout << ip_it->str(2) << endl;
            cout << ip_it->str(3) << endl;
            cout << ip_it->str(4) << endl;
        }

    总的程序:

    #include <iostream>
    #include <string>
    #include <regex>
    using namespace std;
    
    int main()
    {
        //regex_match匹配整个字符串
        regex reg1("\w+day");
        string s1 = "saturday";
        string s2 = "saturday and sunday";
        smatch r1;
        smatch r2;
        cout << boolalpha << regex_match(s1, r1, reg1) << endl;
        cout << boolalpha << regex_match(s2, r2, reg1) << endl;
        cout << "s1匹配结果:" << r1.str() << endl;
        cout << "s2匹配结果:" << r2.str() << endl;
        cout << endl;
    
        //regex_match只返回第一个匹配结果
        smatch rr1;
        smatch rr2;
        cout << boolalpha << regex_search(s1, rr1, reg1) << endl;
        cout << "s1匹配结果:" << rr1.str() << endl;
        cout << boolalpha << regex_search(s2, rr2, reg1) << endl;
        cout << "s1匹配结果:" << rr2.str() << endl;
        cout << endl;
    
    
        //使用iterator返回多个匹配结果
        //结果要用->
        cout << "iterator结果:" << endl;
        sregex_iterator it(s2.begin(), s2.end(), reg1);
        sregex_iterator end;
        for(; it != end; ++it)
        {
            cout << it->str() << endl;
            //cout << *it << endl; 错误
        }
    
        cout << "token_iterator结果:" << endl;
        sregex_token_iterator tit(s2.begin(), s2.end(), reg1);
        sregex_token_iterator tend;
        for(; tit != tend; ++tit)
        {
            cout << tit->str() << endl;
            cout << *tit << endl;
        }
    
        //子表达式匹配
        regex reg2("(\d{1,3}):(\d{1,3}):(\d{1,3}):(\d{1,3})");
        string ip = "0:11:222:333";
        smatch m; 
        regex_match(ip, m, reg2);
        cout << "输出:str()" << endl;
        cout << m.str() << endl;
        cout << m.str(1) << endl;
        cout << m.str(2) << endl;
        cout << m.str(3) << endl;
        cout << m.str(4) << endl;
    
        cout << "输出:[i]" << endl;
        cout << m[0] << endl;
        cout << m[1] << endl;
        cout << m[2] << endl;
        cout << m[3] << endl;
        cout << m[4] << endl;
    
        //输出结果同上
        //regex_search(ip, m, str2);
        cout << endl;
        string ip2 = "0:11:222:333 4:55:66:7";
        sregex_iterator ip_it(ip2.begin(), ip2.end(), reg2);
        sregex_iterator ip_end;
        for(; ip_it != ip_end; ++ip_it)
        {
            cout << ip_it->str() << endl;
            cout << ip_it->str(1) << endl;
            cout << ip_it->str(2) << endl;
            cout << ip_it->str(3) << endl;
            cout << ip_it->str(4) << endl;
        }
    
        return 0;
    
    }
    View Code

    参考:

    http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438191.html

    http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438215.html

  • 相关阅读:
    写给大忙人的spring cloud 1.x学习指南
    spring boot 1.x完整学习指南(含各种常见问题servlet、web.xml、maven打包,spring mvc差别及解决方法)
    Spring-Data-Redis下实现redis连接断开后自动重连(真正解决)
    写给大忙人的nginx核心配置详解(匹配&重写、集群、环境变量&上下文、Lua)
    javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 解决方法
    linux下配置nginx使用ftp目录作为静态资源文件的目标目录
    写给大忙人的centos下ftp服务器搭建(以及启动失败/XFTP客户端一直提示“用户身份验证失败”解决方法)
    linux下mysql 8.0安装
    写给大忙人的Elasticsearch架构与概念(未完待续)
    写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)
  • 原文地址:https://www.cnblogs.com/pukaifei/p/5546968.html
Copyright © 2011-2022 走看看