当egrep执行时,C中的正则表达式不匹配

时间:2014-02-05 22:19:52

标签: c regex

代码:

#include <regex.h>
#include <stdio.h>

int main() {
   unsigned   i;
   regex_t    regex;
   regmatch_t captures[2];
   char *     nmLines[] = {
      "0000000000000a10 t frame_dummy",
      "0000000000000a40 T geom_Init",
      "0000000000000b30 t geom_RectangleAllocate",
   };
   int errCode = regcomp( &regex, ".*\\W(\\w+_Init)\\W*", 0 );
   if( errCode ) {
      char errMsg[1024];
      regerror( errCode, &regex, errMsg, sizeof( errMsg ));
      fprintf( stderr, "%s\n", errMsg );
      return 1;
   }
   for( i = 0U; i < sizeof(nmLines)/sizeof(nmLines[0]); ++i ) {
      errCode =
         regexec(
            &regex,
            nmLines[i],
            sizeof(captures)/sizeof(captures[0]),
            captures,
            0 );
      if( 0 == errCode ) {
         printf( "Match : %s, between %d and %d\n",
            nmLines[i], captures[1].rm_so, captures[1].rm_eo );
      }
      else {
         printf( "Doesn't match : %s\n", nmLines[i] );
      }
   }
   regfree( &regex );
   return 0;
}

输出:

$ gcc -W -Wall -o rx rx.c ; ./rx
Doesn't match : 0000000000000a10 t frame_dummy
Doesn't match : 0000000000000a40 T geom_Init
Doesn't match : 0000000000000b30 t geom_RectangleAllocate

用egrep过滤相同的输出,它匹配3(右边)之间的一条线:

$ ./rx | egrep '.*\W(\w+_Init)\W*'
Doesn't match : 0000000000000a40 T geom_Init
$ 

regexec使用相同的表达式成功时,为什么egrep失败?

2 个答案:

答案 0 :(得分:0)

我的错误已修复!

我使用的表达式是 POSIX扩展正则表达式而不是 POSIX基本正则表达式

修改后的代码是:

int errCode = regcomp( &regex, ".*\\W(\\w+_Init)\\W*", REG_EXTENDED );

Here is an extract of the documentation:

  • REG_EXTENDED:在解释正则表达式时使用POSIX扩展正则表达式(ERE)语法。如果未设置,则使用POSIX Basic Regular Expression(BRE)语法。

regcomp不报告错误,因为该表达式在BRE中有效,但没有任何意义,因为\W不作为字边界而\w作为一个单词部分。这些字符按处理

Here is another helpful documentation关于ERE的{​​{1}}和\W

的GNU扩展

答案 1 :(得分:-1)

在POSIX上使用正则表达式函数时,可以设置多个标志,请参阅http://linux.die.net/man/3/regexec
我相信造成你问题的那个是 REG_ICASE
    不要区分案件。使用此模式缓冲区的后续regexec()搜索将不区分大小写。

REG_EXTENDED
在c

中使用更复杂的正则表达式功能时,它也是一个有用的标志