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

时间:2016-12-27 19:48:06

标签: c++ regex boost

上下文:

我目前正在用C ++编写日期格式库。例如。该库接收格式字符串,例如:dddd, mmmm d, dddd yyyy并生成结果Tuesday, December 26, Tuesday 2016给定年份:2016年,月份:12,日期:26(dddd代表工作日,{{1} }代表日期的数量,d代表月份,mmmm代表年份
我想通过使用yyyy来实现这一目标。

我尝试过:

的Javascript

boost::regex_replace我可以通过以下方式轻松实现:

javascript

C ++

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 '';
}

然而,这给了我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, December 26, Tues26ay 2016"替换为ddddTuesday内的d就会成为Tuesday的目标模式,导致它被替换与regex2

我不知道如何解决这个问题,或者我认为我的C ++解决这个问题的方法是不正确的。是否可以在C ++ boost :: regex中使用类似Javascript的东西?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:5)

我不知道为什么你没有真正的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

加成:

答案 1 :(得分:1)

一个简单的解决方案是用一个控制字符替换工作日,这个控件字符确定不会出现在其他地方,然后在最后用适当的工作日替换它;我没有提升,但它适用于std :: regex。

添加/修改:

boost::regex regex5("(\x01)");
//dddd
pattern = regex_replace(pattern, regex1, "\x01");
//then the fifth check
pattern = regex_replace(pattern, regex5, "Tuesday");