【发布时间】:2016-09-05 16:30:00
【问题描述】:
我正在尝试使用正则表达式来解析源文件并在 C 程序中搜索以单词“LOG”开头的函数,并且可能会或可能不会后跟来自类 [1248AFM] 的第二个字符,然后后跟一个左括号。这是在 Windows 下使用 mingw 开发的,但最终将在 Linux 下使用 gcc 编译和运行。我正在使用 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);
}
【问题讨论】:
-
在 basic 中似乎不起作用,请尝试
int rtn = regcomp(&regex, "LOG[1248AFM]?[(]", REG_EXTENDED);代替(扩展使用括号作为组分隔符,因此使用方括号)。 -
在 BRE 中
?必须转义\?(如果支持) -
Casimir - 我已经尝试过了,但是编译失败了。
-
deamentiaemundi - 我没有想到这一点,你是绝对正确的 - 它工作得很好。谢谢!
-
@deamentiaemundi - 您能否将您的评论重新发布为答案,以便我标记它?在这一点上,我没有足够的声誉来支持评论。