在網上找到的乙個程式
[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...