C语言 使用正则表达式

C语言 本身并不内置支持正则表达式,但可以通过库来实现正则表达式的功能。在 C 中使用正则表达式通常通过 POSIX 正则表达式库(regex.h)实现。,可以执行正则表达式的匹配、编译和替换操作。

1、使用正则表达式

在 C 中使用正则表达式,需要包含 regex.h 头文件。使用 regcomp() 函数将正则表达式字符串编译成正则表达式对象。使用 regexec() 函数执行匹配操作,判断一个字符串是否符合给定的正则表达式。使用 regfree() 函数释放由 regcomp() 创建的正则表达式对象。

#include <stdio.h>
#include <stdlib.h>
#include <regex.h>

int main() {
    regex_t regex;
    int ret;
    const char *pattern = "^[a-zA-Z0-9]+$";  // 只允许字母和数字的正则表达式
    const char *string = "Hello123";  // 待匹配的字符串

    // 编译正则表达式
    ret = regcomp(®ex, pattern, REG_EXTENDED);
    if (ret) {
        printf("Could not compile regex\n");
        return 1;
    }

    // 执行正则表达式匹配
    ret = regexec(®ex, string, 0, NULL, 0);
    if (!ret) {
        printf("Match found!\n");
    } else if (ret == REG_NOMATCH) {
        printf("No match found\n");
    } else {
        char msgbuf[100];
        regerror(ret, ®ex, msgbuf, sizeof(msgbuf));
        printf("Regex match failed: %s\n", msgbuf);
    }

    // 释放正则表达式对象
    regfree(®ex);

    return 0;
}

2、 匹配操作

正则表达式匹配操作可以使用 regcomp() 编译正则表达式,regexec() 执行匹配,regfree() 释放资源。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <regex.h>

int main() {
    // 要匹配的正则表达式
    char *pattern = "^\\d{3}-\\d{2}-\\d{4}$"; // 格式:xxx-xx-xxxx(SSN)
    // 要匹配的字符串
    char *string = "123-45-6789";
    
    regex_t regex;
    regmatch_t matches[1];  // 存储匹配的结果

    // 编译正则表达式
    if (regcomp(®ex, pattern, REG_EXTENDED)) {
        printf("正则表达式编译失败!\n");
        return 1;
    }

    // 执行正则表达式匹配
    if (regexec(®ex, string, 1, matches, 0) == 0) {
        printf("匹配成功!\n");
    } else {
        printf("匹配失败!\n");
    }

    // 释放正则表达式编译的内存
    regfree(®ex);

    return 0;
}

3、替换操作

C 语言中并没有直接的替换函数,但可以通过手动操作字符串来实现替换功能。通常会用正则表达式来查找匹配的部分,然后使用 strcpy() 或其他字符串函数进行替换。

#include <stdio.h>
#include <string.h>
#include <regex.h>

#define MAX_MATCHES 10
#define RESULT_SIZE 1024

// 替换字符串
void regex_replace(const char *input, const char *pattern, const char *replacement) {
    regex_t regex;
    regmatch_t pmatch[MAX_MATCHES];
    char result[RESULT_SIZE];
    size_t result_index = 0;

    // 编译正则表达式
    if (regcomp(®ex, pattern, REG_EXTENDED)) {
        printf("Could not compile regex\n");
        return;
    }

    // 查找所有匹配
    const char *ptr = input;
    while (regexec(®ex, ptr, MAX_MATCHES, pmatch, 0) == 0) {
        // 复制匹配之前的部分
        size_t match_start = pmatch[0].rm_so;
        size_t match_len = pmatch[0].rm_eo - pmatch[0].rm_so;

        // 如果有足够的空间,复制匹配前的部分
        if (result_index + match_start < RESULT_SIZE) {
            strncpy(result + result_index, ptr, match_start);
            result_index += match_start;
        }

        // 插入替换内容
        if (result_index + strlen(replacement) < RESULT_SIZE) {
            strcpy(result + result_index, replacement);
            result_index += strlen(replacement);
        }

        // 移动指针到匹配后的部分
        ptr += pmatch[0].rm_eo;
    }

    // 复制剩余的部分
    if (result_index + strlen(ptr) < RESULT_SIZE) {
        strcpy(result + result_index, ptr);
    }

    // 输出结果
    printf("Result: %s\n", result);

    // 释放正则表达式资源
    regfree(®ex);
}

int main() {
    const char *input = "I have 10 apples and 20 oranges.";
    const char *pattern = "[0-9]+"; // 匹配数字
    const char *replacement = "[number]"; // 替换为[number]

    regex_replace(input, pattern, replacement);

    return 0;
}

推荐阅读
cjavapy编程之路首页