c ++ regex_replace没有进行预期的替换

时间:2015-05-01 17:31:21

标签: c++ regex

以下代码用于将第一行中的9转换为a)* 9。 原始字符串不会被最后一行打印。

std::string ss ("1 + (3+2)9 - 2 ");
std::regex ee ("(\\)\\d)([^ ]");

std::string result;
std::regex_replace (std::back_inserter(result), ss.begin(), ss.end(), ee, ")*$2");
std::cout << result;

这是基于一个非常类似的例子:http://www.cplusplus.com/reference/regex/regex_replace/

MS Visual Studio Express 2013。

1 个答案:

答案 0 :(得分:2)

我看到两个问题:首先,您的捕获组应该只包含字符串的'9'部分,第二个您要用于替换的组不是2美元,而是1美元:

std::string ss ("1 + (3+2)9 - 2 ");
static const std::regex ee ("\\)(\\d)");

std::string result;
std::regex_replace (std::back_inserter(result), ss.begin(), ss.end(), ee, ")*$1");
std::cout << result;

输出:

  

1 +(3 + 2)* 9 - 2

Live Demo

修改

您似乎想要更一般的替代品。

也就是说,只要有一个数字后跟一个开放的paren,例如1(或一个紧密的paren后跟一个数字,例如)1。你想要一个数字和paren之间的星号。

在C ++中,我们可以使用regex_replace执行此操作,但在撰写本文时我们需要其中两个。我们可以把它们连在一起:

std::string ss ("1 + 7(3+2)9 - 2");
static const std::regex ee ("\\)(\\d+)");
static const std::regex e2 ("(\\d+)\\(");

std::string result;
std::regex_replace (std::back_inserter(result), ss.begin(), ss.end(), ee, ")*$1");
result = std::regex_replace (result, e2, "$1*(");
std::cout << result;

输出:

  

1 + 7 *(3 + 2)* 9 - 2

Live Demo2

编辑2

由于您在another question中询问如何将其转换为也可以捕获空格的一个,所以这里稍作修改以处理数字和paren字符之间的可能空格:

static const std::regex ee ("\\)\\s*(\\d+)");
static const std::regex e2 ("(\\d+)\\s*\\(");

Live Demo3