2009-11-25 6 views
2

J'utilise C++ VS 2008 pour supprimer les balises RTF afin d'effectuer une recherche dans le texte RTF uniquement.Suppression des balises RTF par des blocages regex

Le texte RTF que j'obtiens de CRichTextEdit en CString fonctionne très bien. Voici comment je tente de supprimer les balises:

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(); 

La ligne 3 accidents sur le schéma ci-dessus. Un modèle simple pour un remplacement de texte fonctionne très bien: Ex remplacer "fast" de "fast fox" avec une chaîne de texte. le message d'accident est ici:

exception de première chance à 0x7622fbae dans ICView.exe: Microsoft C++ exception: std :: tr1 :: regex_error à l'emplacement de mémoire 0x0012ee20 ..
exception de première chance à 0x7622fbae dans ICView .exe: Microsoft C++ exception: [rethrow] à l'emplacement de mémoire 0x00000000 ..
exception non gérée à 0x7622fbae dans ICView.exe: Microsoft C++ exception: std :: tr1 :: regex_error à l'emplacement de mémoire 0x0012ee20 ..

+0

La difficulté (sinon impossible) d'analyse syntaxique des langages de balisage avec des expressions régulières a reçu beaucoup de. attention sur Stack Overflow récemment. Je ne suis pas assez familier avec RTF pour dire que les mêmes problèmes s'appliquent, mais il semble probable. – pavium

Répondre

0

Vous devez échapper vos barres obliques inverses, car elles servent de caractères d'échappement à la fois dans regex et dans C++ string lite rals. Cela signifie que pour correspondre à une seule barre oblique inverse, vous avez besoin de quatre caractères antislash. Je pense que cela devrait fonctionner: "({\\\\)(.+?)(})|(\\\\)(.+?)(\\b)"

Cela devrait corriger l'exception, mais si cela arrive encore, vous pouvez l'attraper et utiliser les méthodes what() ou code() de l'objet exception pour voir quel est le problème.

Editer: les accolades doivent également être échappées car ce sont des caractères spéciaux dans regex. utilisez donc:

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

Vous avez absolument raison de souligner les antislashs comme caractères d'échappement - merci, je vais les changer. Mais le problème n'est pas de remplacer correctement mes chaînes par de nouveaux motifs mais plutôt de s'écraser sur la ligne 3 où je déclare rx pattern. L'erreur std :: tr1 :: regex_error est renvoyée comme indiquant une mauvaise localisation de la mémoire. Si je déclare const std :: tr1 :: regex rx ("brown fox"); ça va marcher comme un charme. Quel serait le problème? – val

+0

Les barres obliques inverses sont ce qui ne va pas. Ils provoquent l'échappement des parenthèses, ce qui provoque une erreur de parantheses inégalée. – interjay

+0

Les gars, merci un million. De cause c'était les accolades qui devaient avoir été échappées à regex !!!! J'ai stupidement oublié de ces # # # # # # # # Cheers et codage heureux, Val :-) – val

0

Utiliser la gestion des exceptions si vous n'avez pas un contrôle sur modèle à venir dans

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