c語言中使用正則表達式需借助Regex庫。1. 首先包含
c語言中使用正則表達式,需要借助regex庫。核心在于理解 regcomp、regexec、regfree 這三個函數,以及 regex_t 結構體。別指望像python那樣一行代碼搞定,C語言的實現相對底層,需要更多手動操作,但也更靈活。
解決方案
首先,你需要包含
立即學習“C語言免費學習筆記(深入)”;
#include <regex.h> #include <stdio.h> #include <stdlib.h> int main() { regex_t regex; int ret; const char *pattern = "hello[[:space:]]+world"; // 匹配 "hello" 后面跟著一個或多個空格,然后是 "world" const char *text = "hello world"; // 編譯正則表達式 ret = regcomp(®ex, pattern, REG_EXTENDED); // REG_EXTENDED 使用擴展正則表達式語法 if (ret) { fprintf(stderr, "Could not compile regex "); exit(1); } // 執行正則表達式匹配 ret = regexec(®ex, text, 0, NULL, 0); // 0, NULL, 0 表示我們不關心匹配的細節,只關心是否匹配 if (!ret) { printf("Match found! "); } else if (ret == REG_NOMATCH) { printf("No match found. "); } else { char errbuf[100]; regerror(ret, ®ex, errbuf, sizeof(errbuf)); fprintf(stderr, "Regex match failed: %s ", errbuf); exit(1); } // 釋放正則表達式 regfree(®ex); return 0; }
regcomp 的第二個參數是你的正則表達式字符串,第三個參數是標志位,例如 REG_EXTENDED 表示使用擴展正則表達式語法,REG_ICASE 表示忽略大小寫。
接下來,使用 regexec 函數執行匹配。這個函數會在給定的字符串中搜索與編譯后的正則表達式匹配的部分。
regexec 的第二個參數是要匹配的字符串。后面的參數用于存儲匹配的細節,例如匹配的起始位置和長度。如果我們只關心是否匹配,可以將這些參數設置為 0 和 NULL。
最后,使用 regfree 函數釋放 regex_t 結構體占用的內存。這是一個很重要的步驟,否則會導致內存泄漏。
如何處理正則表達式中的特殊字符?
C語言的正則表達式需要對一些特殊字符進行轉義。例如,如果你想匹配一個點號(.),你需要使用 .。如果你想匹配一個反斜杠(),你需要使用 。而且,C語言字符串本身也需要轉義,所以要匹配一個反斜杠,你可能需要寫成 “\”。這有點反人類,但沒辦法,C語言就是這樣。
此外,regcomp 函數的標志位可以影響正則表達式的解析方式。例如,REG_EXTENDED 標志位允許你使用更現代的正則表達式語法,例如 + 和 ?。
#include <regex.h> #include <stdio.h> #include <stdlib.h> int main() { regex_t regex; int ret; const char *pattern = "a\b"; // 匹配 "a" const char *text = "ab"; ret = regcomp(®ex, pattern, 0); if (ret) { fprintf(stderr, "Could not compile regex "); exit(1); } ret = regexec(®ex, text, 0, NULL, 0); if (!ret) { printf("Match found! "); } else if (ret == REG_NOMATCH) { printf("No match found. "); } else { char errbuf[100]; regerror(ret, ®ex, errbuf, sizeof(errbuf)); fprintf(stderr, "Regex match failed: %s ", errbuf); exit(1); } regfree(®ex); return 0; }
如何提取匹配到的子字符串?
如果你想提取匹配到的子字符串,你需要使用 regexec 函數的第三個和第四個參數。第三個參數是 size_t nmatch,表示你想提取的子字符串的數量。第四個參數是 regmatch_t pmatch[],是一個 regmatch_t 類型的數組,用于存儲匹配到的子字符串的起始位置和長度。
regmatch_t 結構體有兩個成員:rm_so 和 rm_eo,分別表示子字符串的起始位置和結束位置。
#include <regex.h> #include <stdio.h> #include <stdlib.h> int main() { regex_t regex; int ret; const char *pattern = "hello([[:space:]]+)(world)"; // 匹配 "hello" 后面跟著一個或多個空格,然后是 "world",并捕獲空格和 "world" const char *text = "hello world"; regmatch_t pmatch[3]; // 我們要捕獲 3 個子字符串:整個匹配、空格、"world" size_t nmatch = 3; ret = regcomp(®ex, pattern, REG_EXTENDED); if (ret) { fprintf(stderr, "Could not compile regex "); exit(1); } ret = regexec(®ex, text, nmatch, pmatch, 0); if (!ret) { printf("Match found! "); for (int i = 0; i < nmatch; i++) { printf("Match %d: start=%ld, end=%ld ", i, (long)pmatch[i].rm_so, (long)pmatch[i].rm_eo); if (pmatch[i].rm_so != -1 && pmatch[i].rm_eo != -1) { char *substring = (char*)malloc(pmatch[i].rm_eo - pmatch[i].rm_so + 1); strncpy(substring, text + pmatch[i].rm_so, pmatch[i].rm_eo - pmatch[i].rm_so); substring[pmatch[i].rm_eo - pmatch[i].rm_so] = ' 成人午夜精品无码区久久| 国产高清美女一级a毛片久久w| 久久国产香蕉视频| 久久精品免费一区二区| 久久久久亚洲AV片无码下载蜜桃| 亚洲精品白浆高清久久久久久| 丁香五月网久久综合| 色综合久久88色综合天天 | 国产毛片欧美毛片久久久| 久久青青草原国产精品免费| 久久综合精品国产一区二区三区 | 精品熟女少妇a∨免费久久| 精品久久久久久久| 午夜视频久久久久一区| 粉嫩小泬无遮挡久久久久久| 久久精品一区二区影院| 久久精品国产亚洲av麻豆色欲| 久久亚洲国产中v天仙www| 久久久久亚洲av综合波多野结衣| 国产成人精品久久一区二区三区av | 国产亚洲成人久久| 久久精品国产亚洲av高清漫画| 欧美精品福利视频一区二区三区久久久精品 | 久久er国产精品免费观看8| 日本久久久久亚洲中字幕| 无码任你躁久久久久久老妇| 久久精品国产免费| 99久久99久久久精品齐齐| 久久婷婷五月综合色奶水99啪| 国产精品99久久久久久宅男| 久久久噜噜噜久久中文福利| 国产精品久久久久久久人人看| 久久无码国产| 久久天天躁狠狠躁夜夜2020老熟妇| 日本精品久久久久中文字幕8| 久久天天躁狠狠躁夜夜96流白浆| 久久亚洲精品无码VA大香大香| 亚洲人成无码网站久久99热国产| 青青青青久久精品国产h久久精品五福影院1421 | 久久精品中文无码资源站| 99精品久久精品一区二区|