来自GNU regex.h中re_match的意外结果,我错过了什么?

时间:2011-05-04 13:28:45

标签: c regex

我正在尝试与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,这与我的预期相反。

任何人都可以给我任何指示或告诉我我缺少的东西吗?

2 个答案:

答案 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;  
}