標準 C/C++ 無內建正則,需使用 POSIX regex.h(Linux 系統預裝)或 PCRE 庫。
regcomp() 將模式串編譯為內部結構 regex_t。regexec() 對目標串進行匹配,結果存入 regmatch_t 陣列。regfree() 釋放 regex_t 佔用資源。
int regcomp(regex_t *preg, const char *pattern, int cflags);
cflags:REG_EXTENDED(擴展正則)、REG_ICASE(忽略大小寫)、REG_NOSUB(不存儲匹配位置)、REG_NEWLINE(識別換行)。preg->re_nsub 記錄捕獲組數。
int regexec(const regex_t *preg, const char *string,
size_t nmatch, regmatch_t pmatch[], int eflags);
pmatch[0]:整個模式匹配範圍(rm_so 起始,rm_eo 結束)。pmatch[1..]:捕獲組匹配範圍。nmatch:pmatch 陣列大小。eflags:REG_NOTBOL(^ 不匹配行首)、REG_NOTEOL($ 不匹配行尾)。
void regfree(regex_t *preg);
重用 regex_t 前必須先 regfree。
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
獲取錯誤信息字符串。
#include
#include
int main() {
regex_t reg;
const char *pattern = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";
char *buf = "helloworld12345@qq.com";
regmatch_t pm[1];
if (regcomp(®, pattern, REG_EXTENDED)) { puts("編譯失敗"); return 1; }
if (regexec(®, buf, 1, pm, 0) == 0) {
printf("匹配: ");
for (int i = pm[0].rm_so; i < pm[0].rm_eo; i++) putchar(buf[i]);
putchar('\n');
} else puts("不匹配");
regfree(®);
return 0;
}
\\ 代表正則中的 \。REG_NOSUB 時 pmatch 可傳 NULL,nmatch=0。regerror 獲取具體原因。POSIX regex.h 提供標準化 C 正則接口,三步編譯-匹配-釋放流程清晰。掌握 cflags/eflags、捕獲組提取、錯誤處理即可在 C 專案中集成正則功能。