我写了以下简单的例子:
#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;
}
并对其行为感到困惑。如果我正确理解了来自there的match_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;
}
。
我错过了什么?
答案 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,那么整个字符串必须匹配。