【发布时间】:2014-12-28 20:57:10
【问题描述】:
我正在使用 std::regex_replace 来修改字符串。我既需要限制替换,又需要完成替换次数。
我使用了以下代码:
std::wregex rx(pattern);
size_t n = 0; // one match
size_t ns = 3;
wstring result = src;
wstring old; // old value
bool replaced = false;
do {
old = result;
result = std::regex_replace(result, rx, replace, std::regex_constants::format_first_only);
replaced = result != old;
if (replaced)
n++;
} while (replaced && n < ns);
效果很好,我既可以限制替代品的数量,也可以获取它们的数量。但是,如果我有以下值,这段代码会从一开始就分析字符串:
"banana" for src, "(an)" for pattern and "$1-" for replace
它产生以下输出:ban---ana 而不是 ban-an-a。显然,这是因为 std::regex_replace 从一开始就分析字符串。一种解决方案可能是使用迭代器来定义要分析的第一个字符,但在这种情况下,我需要获取指向被替换后的字符的迭代器,但我怎样才能得到它?
【问题讨论】:
-
你很幸运,因为
std::regex_replace有两个重载可以满足你的需要,即处理迭代器而不是字符串,包括返回一个迭代器。 -
我知道这种重载,但你能举个例子吗?
-
基本上你要替换同样的东西 3 次。这就是您收到
ban---ana的原因。由于您每次都从字符串的开头开始传递一个字符串。但是,还有另一种方法。