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

use*_*389 3 c++ regex boost

语境:

我目前正在用C++编写日期格式库.例如.该库接收格式化字符串,例如:dddd, mmmm d, dddd yyyy并生成Tuesday, December 26, Tuesday 2016给定年份的结果: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 '';
}
Run Code Online (Sandbox Code Playgroud)

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");
}
Run Code Online (Sandbox Code Playgroud)

然而,这给了我一个结果"Tues26ay, December 26, Tues26ay 2016".其原因是:当我更换模式ddddTuesday中,dTuesday成为目标模式为regex2使其被替换26.

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

任何帮助,将不胜感激!

seh*_*ehe 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";
}
Run Code Online (Sandbox Code Playgroud)

打印

Result: Tuesday, December 26, 2016
Run Code Online (Sandbox Code Playgroud)

奖金:

  • @PatLaugh将最高匹配组索引传递给回调的变体[在c ++ 11中](http://coliru.stacked-crooked.com/a/7b8bda8e43a8c11f)或[c ++ 14](http:/ /coliru.stacked-crooked.com/a/6670b386cd83d5f7); 这是另一个[使用格式化程序回调的四个参数的解决方案](http://coliru.stacked-crooked.com/a/4f712f732dad85bb). (2认同)