通过一个简单的例子来理解c ++正则表达式

时间:2015-06-18 17:28:32

标签: c++ regex

我写了以下简单的例子:

#include <iostream>
#include <string>
#include <regex>

int main ()
{
    std::string str("1231");
    std::regex r("^(\\d)");
    std::smatch m;
    std::regex_search(str, m, r);
    for(auto v: m) std::cout << v << std::endl;
}

DEMO

并对其行为感到困惑。如果我正确理解了来自therematch_result的目的,那么应该只打印一个1 the entire match。实际上:

  

如果成功,它不为空并包含一系列sub_match   对象:第一个sub_match元素对应于整个匹配   并且,如果正则表达式包含要匹配的子表达式([...])

传递给函数的字符串与正则表达式不匹配,因此我们应该#include <stdio.h> #include <stdlib.h> void myFunction(char *args) { char buff1[12]; char buff2[4] = "ABC"; strcpy(buff1,args); printf("Inhalt Buffer2: %s",buff2); } int main(int argc, char *argv[]) { if(argc > 1) { myFunction(argv[1]); } else printf("no arguments sir daimler benz"); getchar(); return 0; }

我错过了什么?

2 个答案:

答案 0 :(得分:12)

您仍然可以获得整个匹配,但整个匹配不适合整个字符串它适合整个正则表达式

例如,考虑一下:

#include <iostream>
#include <string>
#include <regex>

int main()
{
    std::string str("1231");
    std::regex r("^(\\d)\\d"); // entire match will be 2 numbers

    std::smatch m;
    std::regex_search(str, m, r);

    for(auto v: m)
        std::cout << v << std::endl;
}

<强>输出:

12
1

整个匹配(第一个sub_match)是整个正则表达式匹配的部分(字符串的一部分)。

第二个sub_match是第一个(也是唯一的)捕获组

查看原始正则表达式

std::regex r("^(\\d)");
              |----| <- entire expression (sub_match #0)

std::regex r("^(\\d)");
               |---| <- first capture group (sub_match #1)

这就是两个 sub_matches 的来源。

答案 1 :(得分:1)

来自here

    Returns whether **some** sub-sequence in the target sequence (the subject) 
    matches the regular expression rgx (the pattern). The target sequence is 
    either s or the character sequence between first and last, depending on 
    the version used.

因此regex_search将在输入字符串中搜索与正则表达式匹配的任何内容。整个字符串不必匹配,只是其中的一部分。

但是,如果您使用regex_match,那么整个字符串必须匹配。