c++ - 如何从 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)

我可以使用正则表达式进行匹配,但是有没有一种方法不仅可以匹配, 还要从图案中提取零件?例如:

$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/

相关文章:

C++ - 如何将类上的所有成员函数调用委托(delegate)给同一接口(interface)的成员

c++ - 用零并行填充 std::vector

c++ - 使用 memcpy 从字节数组初始化虚拟类

c++ - 使用枚举器的漂亮方法

c++ - boost::locale 和 std::locale 之间的权衡是什么?

c++ - 缺少用于 map 初始化的构造函数

C++: C1083: 'afxwin.h' : 没有这样的文件或目录 - VS2010 with VC6 daffodil

c++ - 通过引用函数 C++ 传递迭代器指向的对象

c++ - 使用 sprintf/printf 使用 %ld 格式字符串而不是 %d 和 int 数据类型的效果

c++ - 这是从容器中获取随机元素的 OK 范围方法吗?