C ++正则表达式转义像“。”这样的函数字符。

时间:2012-12-12 14:38:39

标签: c++ regex escaping

匹配“。”在std::tr1::regex类的字符串中,我使用了一种奇怪的解决方法。

为什么我需要检查“\\\\”。而不是“\\。”?

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

有人可以解释我为什么吗?因为我使用boost::regex类编写了我的代码,所以它真的很烦我,这不需要这种语法。

修改抱歉,regex("\\\\.")似乎没有任何匹配。

编辑2:部分代码

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 = "";
}

3 个答案:

答案 0 :(得分:5)

这是因为\.被解释为转义序列,语言本身试图将其解释为单个字符。你想要的是你的正则表达式包含实际的字符串“\。”,它写成\\.,因为\\是反斜杠字符(\)的转义序列。

答案 1 :(得分:0)

尝试通过ASCII码转义点:

regex("\\x2E")

答案 2 :(得分:0)

事实证明,实际问题是由于使用了sregex_token_iterator的方式。使用match_default意味着它总是在字符串中找到下一个匹配项(如果有的话),即使它们之间存在不匹配。也就是说,

string source = "AAA.BBB";
regex dot("\\.");
sregex_token_iterator wit(source.begin(), source.end(), dot, regex_constants::match_default);

会在点上给出匹配,而不是报告没有匹配。

解决方法是使用match_continuous。