Linux中自带正则表达式应用举例
生活随笔
收集整理的這篇文章主要介紹了
Linux中自带正则表达式应用举例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?環境:Fedora12, C程序:
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <regex.h>// 提取子串 char* getsubstr(char *s, regmatch_t *pmatch) {static char buf[100] = {0};memset(buf, 0, sizeof(buf));memcpy(buf, s+pmatch->rm_so, pmatch->rm_eo - pmatch->rm_so);return buf; }int main(int argc, char **argv) {int status, i;int cflags = REG_EXTENDED;regmatch_t pmatch[5];const size_t nmatch = 5;regex_t reg;const char *pattern = "([A-Z]+)([a-z]+)ID[0-9]+@([a-z]+)\\.([a-z]+)"; // 正則表達式char buf[] = "COMEdavID2012@gmail.com"; // 待搜索的字符串regcomp(?, pattern, cflags);status = regexec(?, buf, nmatch, pmatch, 0);if(status == REG_NOMATCH)printf("No Match\n");else{printf("Match:\n");for(i = 0; i < nmatch; i++){if(pmatch[i].rm_so == -1)continue;char *p = getsubstr(buf, &pmatch[i]);printf("[%d, %d): %s\n", pmatch[i].rm_so, pmatch[i].rm_eo, p);}}regfree(?);return 0; }
編譯運行:
注意:
pmatch[0]用來匹配整個正則表達式
pmatch[1]用來匹配子模式1
pmatch[2]用來匹配子模式2
......
?
思考:
所以如果想從待搜索的字符串中搜索出所有匹配的結果(假設大于1個),怎么辦呢?------- 循環調用regexec,代碼如下:
/*Posix正則表達式應用:循環調用regexec(),以獲得多個匹配的結果 */ #include <stdio.h> #include <string.h> #include <sys/types.h> #include <regex.h>// 提取子串 char* getsubstr(char *s, regmatch_t *pmatch) {static char buf[100] = {0};memset(buf, 0, sizeof(buf));memcpy(buf, s+pmatch->rm_so, pmatch->rm_eo - pmatch->rm_so);return buf; }int main(int argc, char **argv) {int status, i;int cflags = REG_EXTENDED;regmatch_t pmatch[10];const size_t nmatch = 10;regex_t reg;//const char *pattern = "([A-Z]+)([a-z]+)(ID|DB)[0-9]+@([a-z]+)\\.([a-z]+)"; // 正則表達式const char *pattern = "[[:upper:]]+([[:lower:]]+)"; // 正則表達式char buf[] = "c COMEdavDB2012@gmail.com ZHOUcimingID2030@sohu.com"; // 待搜索的字符串char *pSrc = buf, *p = NULL;int next = 0;int mCount = 1; // 匹配的次數int len = strlen(buf);regcomp(?, pattern, cflags); // 編譯正則表達式do // 循環搜索匹配的結果{printf("pSrc = %s\n", pSrc);status = regexec(?, pSrc, nmatch, pmatch, 0);if(status == REG_NOMATCH) // 未找到匹配的結果{printf("No Match%d\n", mCount);break;}else{printf("Match%d:\n", mCount);for(i = 0; i < nmatch; i++) // 輸出此次匹配的結果(包括子模式){if(pmatch[i].rm_so == -1)break;p = getsubstr(pSrc, &pmatch[i]);printf("pmatch[%d] = [%d, %d): %s\n", i, pmatch[i].rm_so, pmatch[i].rm_eo, p);}putchar('\n');pSrc = pSrc + pmatch[0].rm_eo; // 后移搜索的起始位置}mCount++;}while(pSrc < buf + len - 1);regfree(?);return 0; } 編譯運行: [zcm@t #157]$make gcc -c -o a2.o a2.c gcc -o a2 a2.o [zcm@t #158]$./a2 pSrc = c COMEdavDB2012@gmail.com ZHOUcimingID2030@sohu.com Match1: pmatch[0] = [2, 9): COMEdav pmatch[1] = [6, 9): davpSrc = DB2012@gmail.com ZHOUcimingID2030@sohu.com Match2: pmatch[0] = [17, 27): ZHOUciming pmatch[1] = [21, 27): cimingpSrc = ID2030@sohu.com No Match3 [zcm@t #159]$總結
以上是生活随笔為你收集整理的Linux中自带正则表达式应用举例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pyqt2_官网教程
- 下一篇: Linux之tomcat日志管理