首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C語言正則表達式實戰:POSIX regex.h 函數庫完整指南

     編輯:C 語言入門

背景

標準 C/C++ 無內建正則,需使用 POSIX regex.h(Linux 系統預裝)或 PCRE 庫。

三步走流程

  1. 編譯:regcomp() 將模式串編譯為內部結構 regex_t。
  2. 匹配:regexec() 對目標串進行匹配,結果存入 regmatch_t 陣列。
  3. 釋放:regfree() 釋放 regex_t 佔用資源。

核心 API 詳解

1. regcomp


int regcomp(regex_t *preg, const char *pattern, int cflags);
  • cflags:REG_EXTENDED(擴展正則)、REG_ICASE(忽略大小寫)、REG_NOSUB(不存儲匹配位置)、REG_NEWLINE(識別換行)。
  • 成功返回 0,preg->re_nsub 記錄捕獲組數。

2. regexec


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($ 不匹配行尾)。

3. regfree


void regfree(regex_t *preg);

重用 regex_t 前必須先 regfree。

4. regerror


size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);

獲取錯誤信息字符串。

完整示例:Email 格式驗證


#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;
}

常見陷阱

  • 雙重轉義:C 字符串中 \\ 代表正則中的 \。
  • REG_NOSUB 時 pmatch 可傳 NULL,nmatch=0。
  • 編譯失敗需調用 regerror 獲取具體原因。
  • 跨平台建議改用 PCRE2(功能更強、Unicode 支援)。

總結

POSIX regex.h 提供標準化 C 正則接口,三步編譯-匹配-釋放流程清晰。掌握 cflags/eflags、捕獲組提取、錯誤處理即可在 C 專案中集成正則功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved