代码:
#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( ®ex, ".*\\W(\\w+_Init)\\W*", 0 );
if( errCode ) {
char errMsg[1024];
regerror( errCode, ®ex, errMsg, sizeof( errMsg ));
fprintf( stderr, "%s\n", errMsg );
return 1;
}
for( i = 0U; i < sizeof(nmLines)/sizeof(nmLines[0]); ++i ) {
errCode =
regexec(
®ex,
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( ®ex );
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
失败?
答案 0 :(得分:0)
我的错误已修复!
我使用的表达式是 POSIX扩展正则表达式而不是 POSIX基本正则表达式。
修改后的代码是:
int errCode = regcomp( ®ex, ".*\\W(\\w+_Init)\\W*", REG_EXTENDED );
Here is an extract of the documentation:
regcomp
不报告错误,因为该表达式在BRE
中有效,但没有任何意义,因为\W
不作为字边界而\w
作为一个单词部分。这些字符按处理。
Here is another helpful documentation关于ERE
的{{1}}和\W
答案 1 :(得分:-1)
在POSIX上使用正则表达式函数时,可以设置多个标志,请参阅http://linux.die.net/man/3/regexec
我相信造成你问题的那个是
REG_ICASE
不要区分案件。使用此模式缓冲区的后续regexec()搜索将不区分大小写。
REG_EXTENDED
在c