使用 Boost 就地替换正则表达式
In-place regex replacement using Boost
我有一大段文字存储在名为 'text' 的 std::string 中。在这个字符串上,我使用 boost 正则表达式库将某些模式替换为白色 space。这是我的代码。
// 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 个新字符串(删除旧字符串)。
由于内存分配很耗时,有没有办法在不分配新字符串的情况下执行替换'in-place'?
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, " ");
我有一大段文字存储在名为 'text' 的 std::string 中。在这个字符串上,我使用 boost 正则表达式库将某些模式替换为白色 space。这是我的代码。
// 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 个新字符串(删除旧字符串)。
由于内存分配很耗时,有没有办法在不分配新字符串的情况下执行替换'in-place'?
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, " ");