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

C语言regexec返回不匹配问题:字符串符合正则却不匹配

问题分析与解决

你的问题出在正则表达式的语法不符合POSIX扩展正则规范,具体是其中的(*)写法错误。

核心错误点

POSIX扩展正则中,*是量词,必须用来修饰前面的某个匹配单元(比如字符、字符组、括号内的子表达式),单独使用*是非法语法。你写的(*|\\d{1,3})本意是匹配“空字符串或1-3位数字”,但(*)的写法完全不符合规范,导致正则引擎无法正确解析你的匹配规则。

修正方案

把正则中的(*)替换为()(表示匹配空字符串),或者更简洁地用\\d{0,3}(表示0到3位数字,等价于空或1-3位数字)。修正后的正则表达式有两种写法可选:

  1. 保留分支结构的写法:
^\\d{1,8}_[A-Z]{3}_(|\\d{1,3})_(|\\d{1,3})$
  1. 更简洁的量词写法:
^\\d{1,8}_[A-Z]{3}_\\d{0,3}_\\d{0,3}$

修正后的完整代码

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

static char input[] = "00001415_AXI_7_16";

static bool checkSn(char *input)
{
    regex_t regex;
    // 使用修正后的正则表达式
    if (regcomp(&regex, "^\\d{1,8}_[A-Z]{3}_\\d{0,3}_\\d{0,3}$", REG_EXTENDED))
    {
        fprintf(stderr, "Error during creating regex\n");
        return false;
    }
    int ret = regexec(&regex, input, 0, NULL, 0);
    regfree(&regex); // 必须释放正则资源,避免内存泄漏
    return ret == 0;
}

// 测试主函数
int main() {
    printf("Check result: %s\n", checkSn(input) ? "true" : "false");
    return 0;
}

额外注意事项

  • 调用regcomp成功后,必须用regfree释放正则结构体,否则会造成内存泄漏,你的原代码遗漏了这一步。
  • 可以通过regerror函数获取更详细的正则编译错误信息,方便排查问题,比如:
char errbuf[1024];
int err = regcomp(&regex, "...", REG_EXTENDED);
if (err != 0) {
    regerror(err, &regex, errbuf, sizeof(errbuf));
    fprintf(stderr, "Regex compile error: %s\n", errbuf);
    return false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 23:48:08