std :: regex_replace只替换所有其他匹配?

时间:2015-05-18 19:05:20

标签: c++ regex

我需要解析json字符串(使用boost :: property_tree :: read_json)

某些输入字符串无效,如下所示:

"[1,2,3,,,,,4]"

当他们需要看起来像:

"[1,2,3,null,null,null,null,4]"

转换此类字符串的最佳方法是什么?

我试过了

//option A:
std::regex rx1(",,");
auto out_str = std::regex_replace(str_in, rx1, std::string(",null,"));

//option B:
auto out_str = boost::algorithm::replace_all_copy(str_in, ",,", ",null,");

但这两个选项只能取代所有其他比赛。如:

"[1,2,3,null,,null,,4]"

基本上我想要的不是替换,而是插入子串。我想避免回写我正在匹配的字符。

编辑:

我想要的是不要使用或插入逗号。像

这样的东西
//option C 
std::regex rx1(",(),"); 
auto out_str = std::regex_replace(str_in, rx1, std::string("null")); 

但这不起作用(可能是因为它是不正确的正则表达式语法)

5 个答案:

答案 0 :(得分:2)

你真的不需要正则表达式来完成这么简单的任务,简单的搜索和插入就可以了:

#include <iostream>
using namespace std;

int main() {
    std::string str{ "[1,2,3,,,,,4]" };
    do {
        auto pos = str.find( ",," );
        if( pos == std::string::npos )
            break;
        str.insert( pos + 1, "null" );
    } while( true );
    std::cout << str << std::endl;
    return 0;
}

ideone

上运行它

答案 1 :(得分:1)

您的替换字符串不正确。手工完成:

Start: "[1,2,3,,,,,4]"
Replacement 1: "[1,2,3,null,|,,,4]"
                     ^parsed up to here
Repalcement 2: "[1,2,3,null,,null,|,4]"
                                  ^parsed to here, no more matches

您要么想要调整替换字符串,要么重复替换,直到字符串没有变化。

答案 2 :(得分:1)

您可以两次调用您的函数(虽然不是最佳解决方案)

std::string in_str = "[1,2,3,,,,,4]";
std::regex rx1(",,");
auto out_str = std::regex_replace(in_str, rx1, std::string(",null,"));
out_str = std::regex_replace(out_str, rx1, std::string(",null,"));

答案 3 :(得分:1)

您可以在选项B中添加while循环:

auto out_str = str_in;

while (out_str.find(",,") != std::string::npos) {
    out_str =  boost::algorithm::replace_all_copy(out_str, ",,", ",null,");
}

答案 4 :(得分:1)

regex通过搜索第一个匹配替换,然后替换它。 不会发生重叠匹配。因此,如果它看到,,,,则会将前两个逗号替换为,null,,并产生,null,,。但是,它并没有考虑它取代的东西,而是它取代之前的东西。 需要采取的步骤:

  1. 查找第一场比赛: ,,
  2. 取代第一场比赛: ,null,
  3. 移动,只能看到一个逗号,因为它只会在上一次搜索/替换后查看该字符串。
  4. 因此,您将,,替换为,null,,但它不会查看您在替换字符串,null,中使用的逗号,因为它不会执行重叠匹配。

    要确保 重叠匹配,只需运行搜索并将字符串替换两次。