使用Boost替换就地正则表达式

Nit*_*olu 5 c++ regex boost

我有一个巨大的文本段存储在名为'text'的std :: string中.在这个字符串上,我使用boost regex库用空格替换某些模式.这是我的代码.

// Remove times of the form (00:33) and (1:33)
boost::regex rgx("\\([0-9.:]*\\)");
text = boost::regex_replace(text, rgx, " ");

// Remove single word HTML tags
rgx.set_expression("<[a-zA-Z/]*>");
text = boost::regex_replace(text, rgx, " ");

// Remove comments like [pause], [laugh]
rgx.set_expression("\\[[a-zA-Z]* *[a-zA-Z]*\\]");
text = boost::regex_replace(text, rgx, " ");

// Remove comments of the form <...>
rgx.set_expression("<.+?>");
text = boost::regex_replace(text, rgx, " ");

// Remove comments of the form {...}
rgx.set_expression("\\{.+?\\}");
text = boost::regex_replace(text, rgx, " ");

// Remove comments of the form [...]
rgx.set_expression("\\[.+?\\]");
text = boost::regex_replace(text, rgx, " ");
Run Code Online (Sandbox Code Playgroud)

根据我的理解,每次运行regex_replace函数时,它都会创建一个新字符串并将输出写入它.如果我运行具有N种不同模式的regex_replace函数,它将分配N个新字符串(删除旧字符串).

由于内存分配很耗时,有没有办法在不分配新字符串的情况下执行"就地"替换?

小智 2

regex_replace有两个重载,一个是您现在正在使用的,另一个则采用迭代器。您可以将输出迭代器指定为与您正在操作的范围相同的范围。

boost::regex_replace(text.begin(), text.begin(), text.end(), rgx, 
                     " ");
Run Code Online (Sandbox Code Playgroud)

  • 警告:当格式化程序用不同长度的字符串替换匹配项时,结果可能是未定义的。(!!!)(文档没有提到别名/重叠的输入/输出范围) (3认同)