我需要在我的 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(®ex, pattern, REG_EXTENDED);
if(reti){
printf("Could not compile the regex\n");
return false;
}
reti = regexec(®ex, 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/