【发布时间】:2018-12-13 17:43:58
【问题描述】:
我需要在我的 C 代码中包含一个 POSIX ERE 正则表达式编译器/执行器。我选择了本地 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 标准的正则表达式,并且 不 包含反向引用作为一项功能?
【问题讨论】:
-
POSIX 正则表达式不允许反向引用,也不会导致灾难性的回溯。
-
@WiktorStribiżew 我了解 POSIX ERE 标准不允许反向引用,但我无法在 C 中找到不包含此功能的实现。如果你运行上面的代码,它确实可以编译并理解反向引用语法。
-
在将正则表达式传递到您用来过滤或转义您不想要的非 POSIX 功能的库之前,总是有一个直接的选项来预处理正则表达式。实际上,您将为 POSIX-plus 正则表达式库编写一个去扩展包装器。但是,我会首先四处寻找另一个可以满足您需求的正则表达式库,并考虑从头开始编写一个作为另一个明显的选择。
-
很好的问题。在阅读
regex(7)后,我以某种方式假设只有 BRE 会支持反向引用,但您的代码证明并非如此! -
@Tom 我担心你可能是对的,这些是我唯一的解决方案。我希望避免预处理正则表达式或从头开始编写库的雷区。