你只有一个对手,不是两个
regex_search
方法返回单个匹配项。你印的是两个
组
值,组0(整个匹配,
a_file_123.xml
和组1(捕获组值,这里,
123
那是一个子串
捕获
你定义为
(.*)
在模式中)。
如果要匹配多个字符串,则需要使用regex迭代器,而不仅仅是
正则搜索
只返回第一个匹配项。
此外,
.*
太贪婪了,如果同一行中有超过1个匹配项,则返回奇怪的结果。似乎你想匹配字母或数字,所以
*
可替换为
\w+
. 如果真的有什么用
.*?
.
使用
const std::string s = "4345t435\ng54t a_file_123.xml rk\ngreg a_file_j34.xml fger 43t54";
const std::regex rx("a_file_\\w+\\.xml");
std::vector<std::string> results(std::sregex_token_iterator(s.begin(), s.end(), rx),
std::sregex_token_iterator());
std::cout << "Number of matches: " << results.size() << std::endl;
for (auto result : results)
{
std::cout << result << std::endl;
}
见
C++ demo
顺从的
Number of matches: 2
a_file_123.xml
a_file_j34.xml
关于regex的注释
-
a_file_
-文字子串
-
\\w+
-1+字字符(字母,数字,
_
)(请注意,您可以使用
[^.]*?
在这里而不是
\W+
如果你想匹配任何字符,0或更多的重复,尽可能少,直到第一个
.xml
)
-
\\.
-点(如果不转义,它将匹配除换行符以外的任何字符)
-
xml
-字面上的子字符串。
见
regex demo