4

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

为什么我需要检查“\\\\.” 代替 ”\\。”?

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

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

编辑:对不起,regex("\\\\.")似乎什么都不匹配。

Edit2:一些代码

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

3 回答 3

11

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

于 2012-12-12T14:40:47.397 回答
1

事实证明,实际问题在于使用的方式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改用。

于 2012-12-12T16:25:07.287 回答
0

尝试通过其 ASCII 码转义点:

regex("\\x2E")
于 2012-12-12T14:51:26.577 回答