提问者:小点点

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


我在名为text的std::字符串中存储了一大段文本。在这个字符串上,我使用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, " ");

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

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


共2个答案

匿名用户

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

boost::regex_replace(text.begin(), text.begin(), text.end(), rgx, 
                     " ");

匿名用户

由于您的正则表达式替换都不处理先前替换步骤的输出,因此您可以将所有这些正则表达式放入一个更大的正则表达式中并运行该正则表达式一次。

您甚至可以为每个正则表达式部分指定不同的替换字符串,但这不是必需的。

boost::regex rgx("(\\([0-9.:]*\\))|"
                 "(<[a-zA-Z/]*>)|"
                 "(\\[[a-zA-Z]* *[a-zA-Z]*\\])|"
                 "(<.+?>)|"
                 "(\\{.+?\\})|"
                 "(\\[.+?\\])");
text = boost::regex_replace(text, rgx, " ");