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

  • 相关阅读:
    OpenStack-Queens版本缓存yum源的问题
    HTML 表单和输入<textarea><label><fieldset><legend><select><optgroup><option><button>
    HTML 表单和输入<form><input>
    HTML 列表 <ol><ul><li><dl><dt><dd>
    HTML 表格<table><caption><th><tr><td><thead><tbody><tfoot><col><colgroup>
    HTML <span> 标签
    HTML <div> 标签
    HTML 教程延伸阅读:改变文本的外观和含义
    引用、引用和术语定义<abbr><acronym><address><bdo><blockquote><q><cite><dfn>
    HTML“计算机输出”标签 <code><kbd><samp><tt><var><pre>
  • 原文地址:https://www.cnblogs.com/pukaifei/p/5546968.html
Copyright © 2011-2022 走看看