没有反向引用的 C POSIX ERE

标签 c regex posix

我需要在我的 C 代码中包含 POSIX ERE 正则表达式编译器/执行器。我选择了 native regex.h 库,其内容如下所示:

#include <regex.h>

bool
match_posix_regex(const char *pattern, const char *str){
    regex_t regex;
    int reti;

    reti = regcomp(&regex, pattern, REG_EXTENDED);
    if(reti){
        printf("Could not compile the regex\n");
        return false;
    }

    reti = regexec(&regex, str, 0, NULL, 0);
    if(!reti){
        return true;
    }

    else if (reti == REG_NOMATCH){
        return false;
    }

    else{
        printf("ERROR in regex execution\n");
        return false;
    }
}

我注意到这个实现包括对反向引用的支持。据我了解,POSIX ERE 标准确实 not support无论这些标准的许多实现如何,都会进行反向引用。查看 regex.h docs我似乎无法禁用此功能。

我不想包含对反向引用的支持,因为它未包含在标准中,而且它可能会导致灾难性的回溯,如here所述。 。

有没有一种方法可以用 C 语言编译和运行符合 POSIX ERE 标准的正则表达式,并且包含反向引用作为一项功能?

最佳答案

虽然 ERE 正则表达式不是常规语言(由于括号级别匹配),但这方面不会影响引用,因此应该可以编写一个相当简单的正则表达式,这样,如果字符串与其匹配,则它是有效的ERE 没有反向引用或其他扩展,或者它具有不匹配的括号级别。为此,只需将括号视为普通字符即可。大部分工作将编写有效括号表达式的正则表达式。然后,在尝试编译输入字符串之前,将其与此固定正则表达式进行匹配。

我认为以下是括号表达式的正确正则表达式,注释位于各部分下方:

\[^?]?(\[\.([^.]|\.[^]])+\.]|\[=([^]=]|=[^]])+=]|\[:([^]:]|:[^]])+:]|[^]])*]
       ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^ ^^^^
       collating symbol      equivalence class   character class     char

“伪 ERE”是:

($bracket|[^[\]|\[[.(\)*+?{|^$])*

其中 $bracket 是上面的括号正则表达式。

关于没有反向引用的 C POSIX ERE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53767426/

相关文章:

regex - 最大咀嚼是如何实现的?

regex - 正则表达式来测试整个单词

c++ - 编译错误: "pointer can only be subtracted from another pointer"

linux - 为什么我的守护程序在我注销时没有终止?

c - 符号的使用 | & &~ 和 ~ 在 capability.h 文件中

无法在 Cygwin 中使用#include <sys/times.h> 编译 C 代码

c - 用 malloc 分配的内存不会在函数范围之外持续存在?

c++ - 扩展 Lua : check number of parameters passed to a function

c - gcc 栈内存分配

python - 查找 Markdown 代码块之外的图像标签