You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中使用正则表达式提取指定日期字符串

ANSI C正则表达式提取日期的正确实现

问题背景

作为C语言新手,需要学习ANSI C中正则表达式的使用,目标是从字符串"{d(02/01/2019)}-call Ms.ha check this case"中提取日期02/01/2019,但原代码的正则模式存在错误,无法正确匹配。

原代码的正则问题

原正则模式?[0-9]+(\/[0-9]+)+(\/[0-9]+)?存在以下问题:

  • 开头的?是量词(匹配0或1次),不能直接作为正则的起始字符,属于语法错误
  • 模式过于宽泛,没有精准匹配日期的两位数字/两位数字/四位数字格式,可能匹配到不符合预期的字符串
  • 没有结合目标字符串的结构(日期包裹在{d(...)}中)来缩小匹配范围,容易出现误匹配

修正后的代码

下面是修复正则模式并完善错误检查的代码:

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

#define ARRAY_SIZE(arr) (sizeof((arr)) / sizeof((arr)[0]))

int main(int argc, char **argv)
{
    regex_t preg;
    int ret;

    char *string = "{d(02/01/2019)}-call Ms.ha check this case";
    // 精准匹配{d(...)中的日期,捕获组1提取目标日期
    char *pattern = "{d\\(([0-9]{2}\\/[0-9]{2}\\/[0-9]{4})\\)}";
    size_t nmatch = 2; // 0是整个匹配,1是捕获组
    regmatch_t pmatch[2];

    // 编译正则表达式,检查编译错误
    ret = regcomp(&preg, pattern, REG_EXTENDED);
    if (ret != 0) {
        char errbuf[100];
        regerror(ret, &preg, errbuf, sizeof(errbuf));
        fprintf(stderr, "正则编译失败: %s\n", errbuf);
        return EXIT_FAILURE;
    }

    // 执行匹配,检查匹配结果
    ret = regexec(&preg, string, nmatch, pmatch, 0);
    if (ret == 0) {
        printf("找到匹配的日期:\"%.*s\",位置从%d到%d\n",
               pmatch[1].rm_eo - pmatch[1].rm_so, &string[pmatch[1].rm_so],
               pmatch[1].rm_so, pmatch[1].rm_eo - 1);
    } else if (ret == REG_NOMATCH) {
        fprintf(stderr, "未找到匹配的日期\n");
    } else {
        char errbuf[100];
        regerror(ret, &preg, errbuf, sizeof(errbuf));
        fprintf(stderr, "匹配出错: %s\n", errbuf);
    }

    regfree(&preg);
    return EXIT_SUCCESS;
}

关键说明

  • 正则模式解释:{d\\(([0-9]{2}\\/[0-9]{2}\\/[0-9]{4})\\)}
    • {d\\(:匹配字符串中的{d(,注意(在正则中是特殊字符,需要用\\转义
    • ([0-9]{2}\\/[0-9]{2}\\/[0-9]{4}):捕获组,匹配两位数字/两位数字/四位数字的日期格式,[0-9]{2}表示恰好两位数字,\\/转义匹配/
    • \\)}:匹配结尾的)},同样转义特殊字符)
  • 错误检查:添加了regcomp和regexec的返回值检查,用regerror输出错误信息,这是调试正则问题的关键
  • 捕获组使用:nmatch设置为2,对应整个匹配(索引0)和捕获的日期(索引1),确保能正确提取目标内容

ANSI C正则使用最佳实践

  • 总是检查返回值:regcomp和regexec的返回值能直接反映编译或匹配是否成功,避免静默失败
  • 精准匹配模式:根据目标字符串的结构设计正则,避免过度宽泛的模式(比如原代码的[0-9]+),减少误匹配
  • 正确转义特殊字符:在REG_EXTENDED模式下,(, ), {, }, /等都是特殊字符,需要用\\转义
  • 合理设置捕获组:明确需要提取的内容,设置对应的捕获组数量,regmatch_t数组大小要足够
  • 释放资源:使用regfree释放编译后的正则表达式结构,避免内存泄漏

内容的提问来源于stack exchange,提问作者VietV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:11:07