为什么这个正则表达式不匹配?

时间:2015-10-04 01:00:19

标签: regex c++11

std::cout << std::regex_match(std::string("f 1/1/1 3/3/1 4/4/1"), std::regex("f \d+\/\d+\/\d+ \d+\/\d+\/\d+ \d+\/\d+\/\d+")); // -> 0

我希望上面的正则表达式匹配给定的字符串,但事实并非如此。怎么了?

它匹配https://www.regex101.com/,并在Notepad ++中进行测试

1 个答案:

答案 0 :(得分:5)

您的代码存在两个问题,两个问题都与无效的escape-sequences相关:

  1. "\d"被解释为转义序列,结果字符串(传递给std::regex)将不包含您期望的内容 - 而是使用"\\d"来正确获取斜杠后跟字母d

  2. "\/"不是有效的转义序列,您实际上无需转义/,而是将其保留为("/")。

  3. 工作示例

    #include <regex>
    #include <iostream>
    #include <string>
    
    int main () {
      bool result = std::regex_match (
        std::string ("f 1/1/1 3/3/1 4/4/1"),
        std::regex  ("f \\d+/\\d+/\\d+ \\d+/\\d+/\\d+ \\d+/\\d+/\\d+")
      );
    
      std::cout << result << std::endl; // 1
    }