使用boost替换seq数字的出现

时间:2014-12-20 06:51:08

标签: c++ regex boost

如何用包含出现次数的字符串替换多次出现的字符。 例如,如果我有以下表达式。

insert into emp values(?,?,?)

我想要以下转换后的字符串。

insert into emp values(_p_1,_p_2,_p_3)

我正在尝试使用boost正则表达式。

任何人都可以告诉我如何使用boost c ++(无迭代或最小迭代)来实现这一点。

目前我使用以下方法:

        std::wstring q=L"insert into emp values(?,?,?)";
        auto loc = q.find(L"?");
        auto len = wcslen(L"?");
        auto c=1;
        while(loc != std::wstring::npos)
        {
            q.replace(loc, len , L"_p_"+to_wstring(c));
            c++;
            loc = q.find(L"?");
        }
        cout<<q.c_str();

请建议更好,更有效的方法。

1 个答案:

答案 0 :(得分:1)

我只是忘记了正则表达式并试图用Boost做这个简单的事情。

这就像问“如何使用Boost正则表达式向变量添加1”?

最佳答案,恕我直言,只需使用++来完成添加1的任务,并使用循环来用字符串替换特殊字符。

string const query_format = "insert into emp values(?,?,?)";
string const params[] = {"_p_1", "_p_2", "_p3"};

string query;
string const* p = params;
for( char const c : query_format )
{
    if( c == '?' ) { query += *p++; } else { query += c; }
}
// Use `query`

有人可能选择将其包装为replace函数。

免责声明:编译器未触及的代码。


如果您控制query_format字符串,为什么不使占位符与 Boost格式兼容。


重新提出括号要求

  没有或最小迭代的

无论你如何做,都会涉及到迭代。您可以隐藏函数名称后面的迭代,但这就是全部。实际上避免迭代在逻辑上是不可能的,将它隐藏在函数名后面是微不足道的(完全无关紧要的)。