通过正则表达式崩溃删除RTF标记

时间:2009-11-25 01:03:04

标签: c++ visual-studio-2008 rtf

我正在使用C ++ VS 2008剥离RTF标记,仅在RTF文本中进行搜索。

我从CRichTextEdit进入CString的RTF文本工作得很好。 这是我尝试删除标记的方法:

std::tr1::cmatch res;
std::string str = note;
const std::tr1::regex rx("({\\)(.+?)(})|(\\)(.+?)(\b)");
std::string replacement = "";
std::string result = std::tr1::regex_replace(str,rx,replacement);

CString strSearchText = result.c_str();

第3行在上面的图案上崩溃。用于文本替换的简单模式可以正常工作:使用emplty字符串从"fast"替换"fast fox"。崩溃信息在这里:

  

ICView.exe中0x7622fbae的第一次机会异常:Microsoft C ++异常:内存位置0x0012ee20的std :: tr1 :: regex_error ..
     ICView.exe中0x7622fbae的第一次机会异常:Microsoft C ++异常:[rethrow]在内存位置0x00000000 ..
     ICView.exe中0x7622fbae处的未处理异常:Microsoft C ++异常:内存位置0x0012ee20处的std :: tr1 :: regex_error ..

2 个答案:

答案 0 :(得分:0)

您需要转义反斜杠,因为它们在正则表达式和C ++字符串文字中都充当转义字符。这意味着要匹配单个反斜杠,您需要四个反斜杠字符。我认为这应该有效:"({\\\\)(.+?)(})|(\\\\)(.+?)(\\b)"

这应该修复异常,但如果它仍然发生,你可以捕获它并使用异常对象的what()或code()方法来查看问题所在。

编辑:大括号也应该被转义,因为它们是正则表达式中的特殊字符。所以使用:

"(\\{\\\\)(.+?)(\\})|(\\\\)(.+?)(\\b)"

答案 1 :(得分:0)

如果您无法控制模式,请使用异常处理。

std::tr1::regex pattern;
bool bError = false;
try
{
    pattern.assign("*som.thing");
}
catch (std::regex_error error)
{
    bError = true;
}