匹配“。”在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 = "";
}
答案 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。