如何从C 中提取零件

  • 本文关键字:零件 提取 c++ c++11
  • 更新时间 :
  • 英文 :


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

最新更新