C++11 (MSVS2012) 正则表达式在多行 std::string 中查找文件名
c++11 (MSVS2012) regex looking for file names in multiple line std::string
我一直在试图寻找一个明确的答案,但找不到它。
所以假设我有一个字符串(其中 可以是 \r - 我想处理两者 - 不确定这是否相关(
"4345t435ng54t a_file_123.xml rkngreg a_file_j34.xml fger 43t54"
然后我想得到匹配:
- a_file_123.xml
- a_file_j34.xml
这是我的测试代码:
const str::string s = "4345t435ng54t a_file_123.xml rkngreg a_file_j34.xml fger 43t54";
std::smatch matches;
if (std::regex_search(s, matches, std::regex("a_file_(.*)\.xml")))
{
std::cout << "total: " << matches.size() << std::endl;
for (unsigned int i = 0; i < matches.size(); i++)
{
std::cout << "match: " << matches[i] << std::endl;
}
}
输出为:
total: 2
match: a_file_123.xml
match: 123
我不太明白为什么匹配 2 只是"123"......
您只有一个匹配项,而不是两个,因为regex_search
方法返回一个匹配项。您打印的是两个组值,组 0(整个匹配项,a_file_123.xml
此处(和组 1(捕获组值,此处,123
是使用您在模式中定义为(.*)
捕获组捕获的子字符串(。
如果要匹配多个字符串,则需要使用正则表达式迭代器,而不仅仅是仅返回第一个匹配项的regex_search
。
此外,.*
太贪婪了,如果在同一行上有超过 1 个匹配项,则会返回奇怪的结果。您似乎要匹配字母或数字,因此.*
可以替换为w+
.好吧,如果真的有什么,就用.*?
.
用
const std::string s = "4345t435ng54t a_file_123.xml rkngreg 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++演示收益
Number of matches: 2
a_file_123.xml
a_file_j34.xml
关于正则表达式的说明
a_file_
- 文本子字符串\w+
- 1+ 单词字符(字母、数字、_
((请注意,如果您想匹配任何字符,您可以在此处使用[^.]*?
而不是\w+
,0 或更多重复,尽可能少,直到第一个.xml
(\.
- 一个点(如果你不转义它,它将匹配除换行符之外的任何字符(xml
- 文本子字符串。
查看正则表达式演示
相关文章:
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 真的没有来自 std::string_view 的 std::string 的显式构造函数吗?
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 重载 + 自己的类和 std::string 的运算符
- 如何使用 std::string 作为 QHash 的键?
- 将日语 wstring 转换为 std::string
- 可以从std::string继承以提供类型一致性吗
- 构造函数采用std::string_view与std::string并移动
- 在共享缓冲区内存中创建 ::std::string 对象
- std::string.size() 未知行为
- Valgrind 在 std::string::swap 中报告 SIGILL