我正在尝试使用正则表达式来解析源文件并在 C 程序中搜索以单词“LOG”开头并且可能后跟也可能不跟类 [1248AFM] 中的第二个字符的函数,然后后跟一个左括号。这是在 Windows 下使用 mingw 开发的,但最终将使用 gcc 在 Linux 下编译和运行。我正在使用 Jan Goyvaerts 正则表达式教程作为指南,看起来我所追求的是上面显示的括号表达式表达式的零个或一个匹配项。零或一个听起来很像问号元字符,但在我的实验中,我还没有能够让它在括号表达式后工作。为了说明我正在尝试做的事情,我有如下所示的短程序。理想情况下,我只想在 str1 和 str2 上进行匹配。如果我按所示方式编译并运行它,我将无法找到任何匹配项。如果我在方括号表达式后面省略问号,我只会在 str2 上得到匹配,这正是我所期望的。除了问号之外,我还尝试了 {0,1} 形式的区间量词,但也没有成功。我应该使用除括号表达式之外的其他东西吗?
戴夫
#include <stdio.h>
#include <regex.h>
int main(int argc, char **argv) {
regex_t regex;
int rtn = regcomp(®ex, "LOG[1248AFM]?(", 0);
if (rtn) {
printf("compile failed\n");
return(1);
}
char *str1 = " LOG(";
char *str2 = " LOGM(";
char *str3 = " LOG";
char *str4 = " LOGJ(";
int rtn1 = regexec(®ex, str1, 0, NULL, 0);
int rtn2 = regexec(®ex, str2, 0, NULL, 0);
int rtn3 = regexec(®ex, str3, 0, NULL, 0);
int rtn4 = regexec(®ex, str4, 0, NULL, 0);
printf("str1: %d\nstr2: %d\nstr3: %d\nstr4: %d\n",
rtn1, rtn2, rtn3, rtn4);
return(0);
}
最佳答案
正如 Casimir et Hippolyte 所说:您需要转义 ?
,当我发表评论时它逃脱了我。问题是您使用了字符串文字,这意味着您必须转义。
EDIT 正如用户 kdhp 正确指出的那样:?
是基本正则表达式的 Gnu 扩展。但问题仍然存在:需要对 C 文字中的转义符进行转义。
#include <stdio.h>
#include <regex.h>
int main(int argc, char **argv) {
regex_t regex;
// Gnu extension
// int rtn = regcomp(®ex, "LOG[1248AFM]\\?(",0);
// Basic regular expression
int rtn = regcomp(®ex, "LOG[1248AFM]\\{0,1\\}(",0);
if (rtn) {
printf("compile failed\n");
return(1);
}
char *str1 = " LOG(";
char *str2 = " LOGM(";
char *str3 = " LOG";
char *str4 = " LOGJ(";
int rtn1 = regexec(®ex, str1, 0, NULL, 0);
int rtn2 = regexec(®ex, str2, 0, NULL, 0);
int rtn3 = regexec(®ex, str3, 0, NULL, 0);
int rtn4 = regexec(®ex, str4, 0, NULL, 0);
printf("str1: %d\nstr2: %d\nstr3: %d\nstr4: %d\n",
rtn1, rtn2, rtn3, rtn4);
return(0);
}
给予
str1: 0
str2: 0
str3: 1
str4: 1
关于c - POSIX 正则表达式 - 括号表达式的零个或一个匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39334575/