我正在使用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 ..
答案 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;
}