我正在尝试与GNU的regex.h进行一些模式匹配。我已经能够通过一个简单的例子重现正在发生的事情如下:
#include <regex.h>
#include <stdio.h>
#include <string.h>
int main() {
char pat[] = "[Mm]ark";
char name[] = "Mark";
struct re_pattern_buffer pat_buff;
pat_buff.translate = 0;
pat_buff.fastmap = 0;
pat_buff.buffer = 0;
pat_buff.allocated = 0;
re_syntax_options = RE_SYNTAX_EGREP;
printf("Ret value from re_compile_pattern: %d\n", re_compile_pattern(pat, strlen(pat), &pat_buff));
printf("Ret value from re_match: %d\n", re_match(&pat_buff, name, strlen(name), 0, NULL));
regfree(&pat_buff);
return 0;
}
re_compile_pattern()按预期返回0。 re_match()返回-1,这与我的预期相反。
任何人都可以给我任何指示或告诉我我缺少的东西吗?
答案 0 :(得分:0)
确保中间步骤(即编译)成功。您应该将strlen(pat)
而不是sizeof pat
传递给re_compile_pattern()
。
答案 1 :(得分:0)
我无法在我的Fedora 10盒子上编译你的代码。相反,我尝试重新使用它来使用POSIX regcomp()和regexec()API作为上面提到的R ..我知道这并没有完全回答你关于GNU API的问题,但以下代码对我有用:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <regex.h>
char *default_pattern = "[Mm]ark";
char *default_string = "youMarkmywords";
int main(int argc, char **argv) {
int ret;
regex_t preg;
char *pattern = default_pattern;
char *string = default_string;
if (argc >= 3) {
pattern = argv[1];
string = argv[2];
}
ret = regcomp(&preg, pattern, REG_EXTENDED|REG_NOSUB);
if (0 != ret) {
fprintf(stderr, "regcomp failed to compile %s\n", pattern);
exit(EXIT_FAILURE);
}
ret = regexec(&preg, string, 0, NULL, 0);
if (0 == ret) {
printf("Input \"%s\" matched pattern \"%s\"\n", pattern, string);
} else {
fprintf(stderr, "Input \"%s\" didn't match pattern \"%s\"\n", pattern, string);
}
regfree(&preg);
return 0;
}