从conf动态加载正则表达式模式

时间:2014-05-06 17:37:38

标签: c++ regex

我有一个C ++应用程序应该:

  1. 从conf文件动态加载正则表达式模式
  2. 扫描在应用程序调用期间传入的参数,以便与正则表达式模式匹配
  3. 如果找到该正则表达式模式的任何匹配项,请将其替换为[已删除]
  4. 输出文本的“干净”版本
  5. 我无法从conf中加载正则表达式模式。

    我配置了conf文件,以便每一行都应该是一个正则表达式模式(注释只是#)。我将其正确读入定义为string* g_Regex = new string[255]的数组(它是全局变量)。

    我可以正确地将模式拉成字符串,但是定义正则表达式对象对我来说不起作用。

    bool matchRegex(string haystack) {
        bool matchFound = false;
        for(int i = 0; i < sizeof(g_Regex); i++) {
            if(std::regex_match(haystack, std::regex(g_Regex[i]))) {
                g_Matches[i] = 1;
                matchFound = true;
            }
            else {
                g_Matches[i] = 0;
            }
        }
        return matchFound;
    }
    

    所以我发现我正确定义了正则表达式模式。我在做:     的std ::正则表达式(g_Regex [I])

    我应该这样做:     std :: regex r(g_Regex [i]

    我唯一的问题是有一些未定义的正则表达式模式,我不知道如何“动态创建”变量,或者甚至是我需要做的事情。

    比我更聪明的人可以调查这个并且可能帮助我弄清楚如何正确设置它吗?

    [编辑] 我删除了全局变量并将字符串数组转换为向量。我仍然在动态创建正则表达式模式时遇到问题。 [/编辑]

    [编辑2] 这绝对是编译正则表达式的一个问题。我改变了:

    if(std::regex_match(haystack, std::regex(g_Regex.at(i))))
    

    if(std::regex_match(haystack, std::regex("(.*)")))
    

    申请流程。

    g_Regex现在是vector<string> g_Regex [编辑2]

1 个答案:

答案 0 :(得分:0)

首先,全局变量很糟糕。

如果您不知道运行时需要多少个正则表达式模式,那么您应该只使用std :: vector来保存正则表达式,因为您可能不想处理必须动态调整数组大小。

此外,您应该将已编译的正则表达式存储在向量内而不是原始字符串中,以避免在每个循环中重新编译它们。