linux C正規表示式

2021-05-22 09:29:46 字數 1722 閱讀 1755

在網上找到的乙個程式

[c]#include

#include

#include

/* 取子串的函式 */

static char* substr(const char*str,unsigned start, unsigned end)

unsigned n = end - start;

static char stbuf[256];

strncpy(stbuf, str + start, n);

stbuf[n] = 0;

return stbuf;

/* 主程式 */

int main(int argc, char** argv)

char * pattern;

int x, z, lno = 0, cflags = 0;

char ebuf[128], lbuf[256];

regex_t reg;

regmatch_t pm[10];

const size_t nmatch = 10;

/* 編譯正規表示式*/

pattern = argv[1]; //獲取正規表示式

z = regcomp(®, pattern, cflags); //如果編譯成功返回0,其它返回說明有錯誤產生

if (z != 0)

regerror(z, ®, ebuf, sizeof(ebuf));

fprintf(stderr, "%s: pattern '%s' /n",ebuf, pattern);

return 1;

/* 逐行處理輸入的資料 */

while(fgets(lbuf, sizeof(lbuf), stdin))

++lno;

//取得讀取字串的長度,並判斷字串結尾字元是否為回車符'/n'。如果是,將結尾字元改為0

if ((z = strlen(lbuf)) > 0 && lbuf[z-1]== '/n')

lbuf[z - 1] = 0;

/* 對每一行應用正規表示式進行匹配 */

z = regexec(®, lbuf, nmatch, pm, 0);

if (z == reg_nomatch) continue;

else if (z != 0)

regerror(z, ®, ebuf, sizeof(ebuf));

fprintf(stderr, "%s: regcom('%s')/n",ebuf, lbuf);

return 2;

/* 輸出處理結果 */

for (x = 0; x < nmatch && pm[x].rm_so != -1; ++ x)

//                 if (!x) printf("%04d: %s/n", lno, lbuf);

printf(" $%d='%s'/n", x, substr(lbuf,pm[x].rm_so,pm[x].rm_eo));

/* 釋放正規表示式 */

regfree(®);

return 0;

[/c]

但是我發現有些正規表示式式卻不能很好匹配

例如 檔案a中

aadsdfs

asdfasz

adf中adfas

中國adfasd

lskdfo中國

如果用「[a-y]*"就不能匹配「中國adfasd"

還在研究中

linux c 正規表示式

最近有這麼個需求,c搞搞正則,畢竟regular expression so強大 標準的c和c 都不支援正規表示式,但有一些函式庫可以輔助c c 程式設計師完成這一功能,其中最著名的當數philip hazel的perl compatible regular expression庫,許多linux發...

linux c 正規表示式

標準的c和c 都不支援正規表示式,但有一些函式庫可以輔助c c 程式設計師完成這一功能,其中最著名的當數philip hazel的perl compatible regular expression庫,許多linux發行版本都帶有這個函式庫。編譯正規表示式 為了提高效率,在將乙個字串與正規表示式進行...

linux c 正規表示式

include include include include 要提取出字串中的時間,訊息型別,傳送者 接收者 訊息內容 int main int argc,char argv 0 9 0 9 t 0 9 0 9 0 9 message a za z 0 9a z to 0 9a z regex t...