使用Boost替换正则表达式

In-place regex replacement using Boost

本文关键字:正则表达式 替换 Boost 使用      更新时间:2023-10-16

我有一段巨大的文本存储在一个名为"text"的std::字符串中。在这个字符串中,我使用boost正则表达式库用空白替换某些模式。这是我的密码。

// 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_replacefunction,它会分配N个新字符串(删除旧字符串)。

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

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

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

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

您甚至可以为每个regex部分指定不同的替换字符串,但这在这里不是必需的。

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