ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C提升正则表达式替换条件

2019-08-23 23:08:24  阅读:155  来源: 互联网

标签:c regex boost


语境:

我目前正在用C编写日期格式库.例如.该库采用格式化字符串,例如:dddd,mmmm d,dddd yyyy并生成结果2016年12月26日星期二给定年份:2016年,月份:12,日期:26(dddd代表工作日,d代表日期在数量上,mmmm代表月份,yyyy代表年份).

我想通过使用boost :: regex_replace来实现这一点.

我尝试过的:

使用Javascript

在javascript中我可以通过以下方式轻松实现:

var pattern = 'dddd, mmmm d, yyyy';
pattern.replace(/(dddd)|(d)|(mmmm)|(yyyy)/gi, function (dddd, d, mmmm, yyyy){
    if (dddd) {
        return 'Tuesday';
    }

    if (d) {
        return '26'
    }

    if (mmmm) {
        return 'December';
    }

    if (yyyy) {
       return '2016';
    }
    return '';
}

C

boost::regex regex1("(dddd)");
boost::regex regex2("(d)");
boost::regex regex3("(mmmm)");
boost::regex regex4("(yyyy)");
boost::smatch match;

// dddd
if (boost::regex_search(pattern, match, regex1))
{
    pattern = boost::regex_replace(pattern, regex1, "Tuesday");
}

// d
if (boost::regex_search(pattern, match, regex2))
{
    pattern = boost::regex_replace(pattern, regex2, "26");
}

// mmmm
if (boost::regex_search(pattern, match, regex3))
{
        pattern = boost::regex_replace(pattern, regex3, "December");
}

// yyyy
if (boost::regex_search(pattern, match, regex4))
{
    pattern = boost::regex_replace(pattern, regex4, "2016");
}

然而,这给了我“Tues26ay,12月26日,2016年2月26日”的结果.原因是:一旦我用星期二替换模式dddd,星期二内的d就成为regex2的目标模式,导致它被替换为26.
我不知道如何解决这个问题,或者我认为我的C方式解决这个问题是不正确的.是否可以在C boost :: regex中使用类似Javascript的东西?

任何帮助,将不胜感激!

解决方法:

我不知道为什么你没有真正的1对1翻译:

Live On Coliru

#include <boost/regex.hpp>
#include <iostream>

int main() {
    std::string pattern = "dddd, mmmm d, yyyy";
    pattern = boost::regex_replace(pattern, boost::regex("(dddd)|(d)|(mmmm)|(yyyy)"), [](auto& match)->std::string{
        if (match.str() == "dddd")
            return "Tuesday";

        if (match.str() == "d")
            return "26";

        if (match.str() == "mmmm")
            return "December";

        if (match.str() == "yyyy")
            return "2016";

        return "";
    });

    std::cout << "Result: " << pattern << "\n";
}

打印

Result: Tuesday, December 26, 2016

奖金:

> c 03版本Live On Coliru
>替代匹配选择C++11 on submatch index,C++11 on named submatches

标签:c,regex,boost
来源: https://codeday.me/bug/20190823/1701930.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有