标准C++正则表达式使用示例



#include <regex>
void t_regular_expression()
{

    //regex_match要求整个字符串匹配上才返回 true
    std::string str_regex = "([1-9]\\d{3})-(0\\d|1[012])-([01]\\d|2[0-9]|3[01])";
    regex reg{str_regex};

    std::vector<std::string> date_vec{"2019-01-01",
                                      "2019-12-31",
                                      "2019-05-06",
                                      "20111-05-12",
                                      "2011-005-23",
                                      "2011-05-333",
                                      "2015-5-6",
                                     "hello 2023-03-03!"};

    auto t_regex_match = [reg, date_vec](){
        std::cout << "test for regex_match" << std::endl;

        for(std::string date_str : date_vec)
        {
            if(smatch match_result; regex_match(date_str, match_result, reg))
            {
                std::cout << date_str << " matched" << std::endl;

                std::cout << "matched size: " << match_result.size() << std::endl;
                std::cout << match_result.str(0) << " : " << match_result.str(1) << "-" << match_result.str(2) << "-" << match_result.str(3) << std::endl;

                //也可以这样获得捕获的字符串 依次是: 匹配的整个字符串, 第1个匹配, 第2个匹配 ......
                for(auto mr : match_result)
                {
                    std::cout << mr <<std::endl;
                }

                std::cout << std::endl;

            }
            else
            {
                std::cout << date_str << " not match" << std::endl;
            }
        }};

    t_regex_match();


    //regex_search匹配子串
    auto t_regex_search = [reg, date_vec](){
        std::cout << "test for regex_search" << std::endl;
        for(std::string date_str : date_vec)
        {
            if(smatch match_result; regex_search(date_str, match_result, reg))
            {
                std::cout << date_str << " matched" << std::endl;

                std::cout << "matched size: " << match_result.size() << std::endl;
                std::cout << match_result.str(0) << " : " << match_result.str(1) << "-" << match_result.str(2) << "-" << match_result.str(3) << std::endl;

                //也可以这样获得捕获的字符串 依次是: 匹配的整个字符串, 第1个匹配, 第2个匹配 ......
                for(auto mr : match_result)
                {
                    std::cout << mr <<std::endl;
                }

                std::cout << std::endl;
            }
            else
            {
                std::cout << date_str << " not match" << std::endl;
            }
        }
    };

    t_regex_search();


    auto t_search_backreference = [](){
        std::cout << "test for regex_search backreferance" << std::endl;
        std::string target = "2001 is not a symmetrical year, 2002 is a symmetrical year!";

        auto search = [](std::string target, std::regex reg){
            if(smatch match_result; std::regex_search(target, match_result, reg))
            {
                std::cout << "matched a symmetrical year: " << match_result.str(0) <<std::endl;

                std::cout << "match_result: " << match_result.size() << std::endl;
            }
            else
            {
                std::cout << "not matched" <<std::endl;
            }};


        std::regex reg2("(\\d)(\\d)\\2\\1");
        search(target, reg2);

    };

    t_search_backreference();



    auto t_regex_iterator = [reg](){
        std::cout << "test for sregex_iterator" << std::endl;
        std::string date_string ="2019-01-01" "2019-12-31" "2019-05-06" "20111-05-12" "2011-005-23" "2011-05-333" "2015-5-6" "hello 2023-03-03!";

        const sregex_iterator end;//这个要写上,通过默认构造函数构造一个尾迭代器
        //注意
        for(sregex_iterator iter{cbegin(date_string), cend(date_string), reg}; iter != end; ++iter)
        {
            std::smatch match = *iter;

            std::cout << "match size: " <<match.size() << std::endl;

            std::string matched_str = match.str(0);
            std::cout << "matched string: " << matched_str << std::endl;

            std::string matched_str_year = match.str(1);
            std::cout << "year: " << matched_str_year << std::endl;

            std::string matched_str_month = match.str(2);
            std::cout << "month: " << matched_str_month << std::endl;

            std::string matched_str_day = match.str(3);
            std::cout << "day: " << matched_str_day << std::endl;
        }
    };

    t_regex_iterator();

    auto t_regex_token_iterator = [reg](){
        std::cout << "test for sregex_token_iterator" << std::endl;
        std::string date_string ="2019-01-01" "2019-12-31" "2019-05-06" "20111-05-12" "2011-005-23" "2011-05-333" "2015-5-6" "hello 2023-03-03!";

        const sregex_iterator end;//这个要写上,通过默认构造函数构造一个尾迭代器
        //注意
        for(sregex_iterator iter{cbegin(date_string), cend(date_string), reg}; iter != end; ++iter)
        {
            std::smatch match = *iter;

            std::cout << "match size: " <<match.size() << std::endl;

            std::string matched_str = match.str(0);
            std::cout << "matched string: " << matched_str << std::endl;

            std::string matched_str_year = match.str(1);
            std::cout << "year: " << matched_str_year << std::endl;

            std::string matched_str_month = match.str(2);
            std::cout << "month: " << matched_str_month << std::endl;

            std::string matched_str_day = match.str(3);
            std::cout << "day: " << matched_str_day << std::endl;
        }
    };

    t_regex_token_iterator();

    auto t_regex_token_iterator_act_as_tokenizer = [](){
        regex reg { R"(\s*[,;]\s*)" };
        string str_to_tokenize{"This is from xian,, it's a nice; day!"};

         const sregex_token_iterator end;
         for (sregex_token_iterator iter { cbegin(str_to_tokenize), cend(str_to_tokenize), reg, -1}; iter != end; ++iter) {
            cout << iter->str() << endl;
         }
    };

    t_regex_token_iterator_act_as_tokenizer();

    auto t_regex_replace = [](){
        const string str_to_match{"<body><h1>Header</h1><p>Some text</p></body>"};

        regex reg{"<h1>(.*)</h1><p>(.*)</p>"};

        const string str_replacement{"H1=$1, P=$2"};

        string result_format_default{regex_replace(str_to_match, reg, str_replacement, regex_constants::format_default)};

        string result_format_no_copy{regex_replace(str_to_match, reg, str_replacement, regex_constants::format_no_copy)};

        string result_format_first_only{regex_replace(str_to_match, reg, str_replacement, regex_constants::format_first_only)};

        std::cout << "str_to_match: " << str_to_match << std::endl;
        std::cout << "format_default: " << result_format_default << std::endl;
        std::cout << "format_no_copy: " << result_format_no_copy << std::endl;
        std::cout << "format_first_only: " << result_format_first_only << std::endl;

    };

    t_regex_replace();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值