如何从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,请看重复捕获,这应该解决捕获组问题。