我需要解析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"));
但这不起作用(可能是因为它是不正确的正则表达式语法)
答案 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;
}
上运行它
答案 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,,
。但是,它并没有考虑它取代的东西,而是它取代之前的东西。
需要采取的步骤:
因此,您将,,
替换为,null,
,但它不会查看您在替换字符串,null,
中使用的逗号,因为它不会执行重叠匹配。
要确保 重叠匹配,只需运行搜索并将字符串替换两次。