C++ regex échapper punctional de caractères comme “.”

Correspondant à un "." dans une chaîne de caractères avec la std::tr1::regex classe me fait utiliser un drôle de solution de contournement.

Pourquoi ai-je besoin de vérifier les "\\\\." au lieu de "\\."?

regex(".") //Matches everything (but "\n") as expected.
regex("\\.") //Matches everything (but "\n").
regex("\\\\.") //Matches only ".".

Quelqu'un peut-il m'expliquer pourquoi? C'est vraiment me tracasse depuis que j'ai eu mon code écrit à l'aide de boost::regex des classes, ce qui n'a pas besoin de cette syntaxe.

Edit: Désolé, regex("\\\\.") semble correspondre à rien.

Edit2: du code

void parser::lex(regex& token)
{
    //Skipping whitespaces
    {
        regex ws("\\s*");
        sregex_token_iterator wit(source.begin() + pos, source.end(), ws, regex_constants::match_default), wend;
        if(wit != wend)
            pos += (*wit).length();
    }

    sregex_token_iterator it(source.begin() + pos, source.end(), token, regex_constants::match_default), end;
    if (it != end)
        temp = *it;
    else
        temp = "";
}
  • Quel compilateur et les options du compilateur que vous utilisez?
  • Je vois que vous eu le même problème dans la rédaction de votre question que j'ai eu avec ma réponse. <.< c'est pourquoi il a d'abord dit \ et \\, droit?
  • Oui, en effet.
  • Pour l'avoir testé dans Visual Studio 2012, je n'ai pas le même problème. \\. semble correspondre à "\.", comme il se doit
  • Bizarre, peut-être que c'est mon code. J'ai posté la fonction principale.
  • laissez-nous continuer cette discussion dans le chat
  • Vous savez, la même version de C++ qui est inclus std::regex également inclus raw littéraux de chaîne. On pourrait dire R":(\.):" et ne pas avoir à s'échapper tellement -- seulement les choses que la regex lui-même doivent être échappés.

InformationsquelleAutor Tim | 2012-12-12