代码之家  ›  专栏  ›  技术社区  ›  Helder Daniel

C++ STD::ReXExxMatHe()与字符串开头的字符不匹配,但STD::ReExxRePosiy()确实替换了它[复制]

  •  -1
  • Helder Daniel  · 技术社区  · 6 年前

    下面的程序已经被编写成用C++ 11获取“天”信息。 std::regex_match & std::regex_search . 但是,使用第一个方法返回 false true

    Difference between regex_match and regex_search?

    #include<iostream>
    #include<string>
    #include<regex>
    
    int main()
    {
        std::string input{ "Mon Nov 25 20:54:36 2013" };
        //Day:: Exactly Two Number surrounded by spaces in both side
        std::regex  r{R"(\s\d{2}\s)"};
        //std::regex  r{"\\s\\d{2}\\s"};
        std::smatch match;
    
    if (std::regex_match(input,match,r)) {
            std::cout << "Found" << "\n";
        } else {
            std::cout << "Did Not Found" << "\n";
        }
    
        if (std::regex_search(input, match,r)) {
            std::cout << "Found" << "\n";
            if (match.ready()){
                std::string out = match[0];
                std::cout << out << "\n";
            }
        }
        else {
            std::cout << "Did Not Found" << "\n";
        }
    }
    

    输出

    Did Not Found
    
    Found
    
     25 
    

    为什么第一个regex方法返回 在这种情况下?。这个 regex 似乎是正确的,所以理想情况下两者都应该被退回 . 我通过更改 std::regex_match(input,match,r) std::regex_match(input,r) 发现它还是回来了 false.

    有人能解释一下上面的例子,以及这些方法的一般用例吗?

    0 回复  |  直到 9 年前
        1
  •  33
  •   Praetorian Luchian Grigore    11 年前

    regex_match 只返回 true regex_search 即使只有子序列匹配 regex .

    引用N3337,

    正则表达式匹配 [重新校准匹配]

    确定正则表达式之间是否存在匹配 e ,和 所有字符序列 [first,last) . ... 是的 false 否则。

    正则表达式匹配

    正则表达式搜索 过载描述为

    §28.11.3/2

    影响: 确定是否存在 其中的一些子序列 [第一,最后) 电子 ... 退换商品 如果存在这样的序列, 否则。


    正则表达式 r{R"(.*?\s\d{2}\s.*)"}; 二者都 正则表达式匹配 正则表达式搜索 将成功(但匹配结果不只是日期,而是整个日期字符串)。

    Live demo 您的示例的修改版本,其中一天由两个用户捕获和显示 正则表达式匹配 正则表达式搜索 .

        2
  •  19
  •   Benjamin Lindley    11 年前

    regex_search 查看字符串以查找字符串的任何部分是否与regex匹配。 regex_match 检查整个字符串是否与regex匹配。作为一个简单的示例,给定以下字符串:

    "one two three four"
    

    如果我使用 在字符串上的表达式 "three" “三” "one two three four"

    但是,如果我使用 正则表达式匹配 相反,它会失败,因为 不是整根弦,只是它的一部分。