如何从C 中提取零件
How to extract parts from regex in C++?
如何从c 中提取正则零件?
例如,我有这样的模式:
new line means "followed by"
delimiter string,
name,
':' character,
list of Xs, where X is name; (string followed by ';' character)
我可以使用Regex进行匹配,但是有没有办法匹配,而且还从图案中提取零件吗?例如:
$DatasetName: A; B; C;
是一个给定的字符串,我想提取数据集名称,然后列名称a,b和c。
好吧,正如已经建议您的手工解析一样(仅是出于演示目的,并不声称是完美的):
):#include <iostream>
#include <vector>
#include <string>
bool parse_by_hand(const std::string& phrase)
{
enum parse_state
{
parse_name,
parse_value,
};
std::string name, current_value;
std::vector<std::string> values;
parse_state state = parse_name;
for(std::string::const_iterator iterator = phrase.begin(); iterator != phrase.end(); iterator++)
{
switch(state)
{
case parse_name:
if(*iterator != ':')
name += *iterator;
else
state = parse_value;
break;
case parse_value:
if(*iterator != ';')
current_value += *iterator;
else
{
state = parse_value;
values.push_back(current_value);
current_value.clear();
}
break;
default:
return false;
}
}
// Error checking here, name parsed? values parsed?
return true;
}
int main(int argc, char** argv)
{
std::string phrase("$DatasetName: A; B; C;");
parse_by_hand(phrase);
}
至于std::regex
,我的第一张照片是针对此类([^:]*):(([^;]*);)*
的,但是除非我没记错(我希望有人纠正我),递归捕获组将为您提供最后一个匹配的值,而不是所有值因此,您仍然必须使用regex_search
进行多次迭代,从而消除了桌子上的"单线regex匹配"的便利性。另外,如果std::regex
不是必须的,并且您可以使用Boost,请看重复捕获,这应该解决捕获组问题。
相关文章:
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么istream不支持右值提取
- 如何设置一个范围来提取我想要获得的信息
- 视觉工作室项目.提取源文件夹名称
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 从字符串中提取整数并形成一个数组
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 从 std::vector<无符号字符>切片中提取 int?
- 在C++中使用重载提取运算符时出现问题
- 在 Qt(C++) 中使用 QProcess 解压缩 - 提取目录问题
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 无法从 std::string 中提取C++ Unicode 符号
- 如何从也包含C++字母的文本文件中提取某些数字?
- 如何从适合一定范围的数字中提取数字?
- C++从通用引用中提取实际类型
- 从运行服务的应用程序代码中提取窗口句柄
- 如何在字符串中找到字符,然后在C++中提取其余的字符串
- 如何从C 中提取零件