的代碼不匹配:正則表達式使用C時的egrep確實
#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
成功具有相同的表達?
的GNU擴展沒有保證您的'regex'庫支持同一正則表達式的語法'egrep'。您需要閱讀庫的文檔,並確保您使用的是一致的正則表達式。 – larsks
這是什麼'sizeof(captureures)/ sizeof(captures [0])'?只有一個捕獲組是正確的? – sln
在這種情況下,sizeof(captures)/ sizeof(captures [0])返回2:一個用於整個表達式,一個用於捕獲 – Aubin