代码之家  ›  专栏  ›  技术社区  ›  Rajeshwar

std::带有字符\、{、}的正则表达式-如何转义

  •  0
  • Rajeshwar  · 技术社区  · 5 年前

    匹配“a”与 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 回复  |  直到 7 年前
        1
  •  11
  •   Agentlien    13 年前

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

        2
  •  1
  •   Ardent Coder Michael Richardson    6 年前

    事实证明,真正的问题是由于 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 相反

        3
  •  0
  •   Jakub Zaverka    13 年前

    尝试通过ASCII码转义圆点:

    regex("\\x2E")