如何在 C++ 中从正则表达式中提取部分?
例如我有这样的模式:
new line means "followed by"
delimiter string,
name,
':' character,
list of Xs, where X is name; (string followed by ';' character)
我可以使用正则表达式进行匹配,但是有没有一种方法不仅可以匹配, 还要从图案中提取零件?例如:
$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< 进行多次迭代
消除了“单行正则表达式匹配”的便利性。或者,如果 std::regex
不是必须的并且您可以使用 Boost,请查看 Repeated captures ,这应该可以解决捕获组问题。
关于c++ - 如何从 C++ 中的正则表达式中提取部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21286664/