c正则表达式 regex.h语法函数与完整代码
时间:2026-08-10 | 作者:清风无痕 | 阅读:0C语言标准库本身没有内置正则表达式功能,在支持POSIX的系统中通常可借助regex.h完成模式编译、文本匹配和资源释放。本文介绍常用语法、核心函数、完整流程及错误处理方法,帮助读者正确使用C正则表达式。
C语言中的正则表达式实现
ISO C标准库没有规定正则表达式接口,因此具体实现取决于运行环境。在Linux、macOS等支持POSIX的系统中,可以包含regex.h并使用其中的函数。程序通常先把模式编译为regex_t对象,再用该对象匹配一个或多个字符串,最后释放相关资源。若目标平台不提供POSIX接口,则需要选择兼容的第三方正则表达式库,并按照该库的接口完成相同步骤。
常用语法与匹配模式
POSIX正则表达式分为基本正则表达式和扩展正则表达式。以下示例均要求在regcomp中传入REG_EXTENDED:点号.通常匹配任意单个字符;*、+、分别表示前一部分出现零次或多次、一次或多次、零次或一次;[abc]和[^abc]分别表示字符集合和排除集合;(ab)用于分组;a|b表示二选一;{m}、{m,}、{m,n}用于限定重复次数;^和$约束字符串开头与结尾。反斜杠可转义具有特殊含义的字符。需要子匹配时,可用括号分组并向regexec传入regmatch_t数组,数组第0项表示整体匹配,后续项依次对应各捕获分组。使用REG_ICASE可忽略英文字母大小写,使用REG_NOSUB则只判断是否匹配而不保存匹配位置。默认情况下,点号可以匹配换行符;传入REG_NEWLINE后,点号和非匹配字符列表不能匹配换行符,同时^和$还能匹配文本中换行符之后和之前的位置。
- ^[0-9]+$:12345匹配,12a45和空字符串不匹配
- ^[A-Za-z][A-Za-z0-9_]*$:name_2匹配,2name不匹配
- ^(cat|dog)$:cat和dog匹配,cats不匹配;括号形成第1个子匹配
- ^[A-Z][0-9]{2,4}$:A123和99匹配,AB123和7不匹配
- ^[[:space:]]+$:空格加制表符匹配,
abc不匹配 - ^colour$:
color和colour匹配,colouur不匹配
编译与执行匹配
首先声明regex_t变量,然后调用regcomp编译模式。返回值为零表示编译成功;非零表示编译失败,此时可先用regerror(code, ®ex, NULL, 0)取得所需缓冲区长度,分配缓冲区后再次调用regerror生成并输出错误说明。只有编译成功后才能调用regexec。regexec返回零表示找到匹配,返回REG_NOMATCH表示没有匹配,其他非零值表示执行错误,也应通过regerror输出信息。需要获取匹配片段时,可准备regmatch_t数组,其中rm_so记录起始偏移,rm_eo记录结束偏移。无论匹配、未匹配还是执行错误,只要模式已经成功编译,结束时都应调用regfree释放内部资源;编译失败时不要调用regfree。
- 声明regex_t对象并准备模式字符串
- 调用regcomp并处理编译错误
- 调用regexec匹配目标文本
- 明确区分匹配成功、REG_NOMATCH和其他执行错误
- 调用regfree释放已成功编译的正则对象
完整代码示例
下面是可直接编译运行的完整程序。它编译判断非空数字字符串的模式,依次演示匹配成功和REG_NOMATCH,并为regcomp及regexec的其他错误动态取得错误文本。可将代码保存为regex_demo.c,执行cc -Wall -Wextra -std=c11 regex_demo.c -o regex_demo编译,再运行./regex_demo。
#include
#include
#include
static void print_regex_error(int code, const regex_t *regex, const char *prefix)
{
size_t size = regerror(code, regex, NULL, 0);
char *message = malloc(size);
if (message == NULL) {
fprintf(stderr, "%s: unable to allocate error buffern", prefix);
return;
}
regerror(code, regex, message, size);
fprintf(stderr, "%s: %sn", prefix, message);
free(message);
}
int main(void)
{
const char *pattern = "^[0-9]+$";
const char *tests[] = {"123456", "12a3", ""};
regex_t regex;
int code = regcomp(®ex, pattern, REG_EXTENDED);
if (code != 0) {
print_regex_error(code, ®ex, "regcomp failed");
return EXIT_FAILURE;
}
int status = EXIT_SUCCESS;
size_t count = sizeof tests / sizeof tests[0];
for (size_t i = 0; i < count; ++i) {
code = regexec(®ex, tests[i], 0, NULL, 0);
if (code == 0) {
printf(""%s": matchn", tests[i]);
} else if (code == REG_NOMATCH) {
printf(""%s": no matchn", tests[i]);
} else {
print_regex_error(code, ®ex, "regexec failed");
status = EXIT_FAILURE;
break;
}
}
regfree(®ex);
return status;
} 常见问题与实践建议
正则模式写在C字符串中时,需要同时经过C字符串解析和正则表达式解析。例如,要匹配目标文本a.b中的字面量点号,C字符串字面量应写成".",正则引擎实际收到的模式是.,目标字符是.;要匹配目标文本C:temp中的字面量反斜杠,C字符串字面量中的对应模式应写成"\",正则引擎实际收到的模式是,匹配目标是一个反斜杠。POSIX ERE不支持部分常见PCRE写法,例如d不能用来表示数字,应改用[0-9]或[[:digit:]]。不要忽略regcomp的返回值,也不要在编译失败后调用regexec或regfree。对于固定模式,可以编译一次后重复匹配多段文本,减少不必要的开销。正则表达式适合处理格式明确的文本规则,但复杂语法、嵌套结构或完整协议解析通常更适合使用专门的解析器。
掌握模式编译、匹配执行、错误检查和资源释放这四个环节,就能在支持POSIX的C程序中稳妥使用正则表达式。编写模式时应先明确边界和输入规则,再用代表性数据验证匹配结果。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- c 语言基础教程怎么入门?语法、流程与示例说明
- 时间:2026-08-13
-
- c实现多线程 pthread创建回收与互斥锁同步
- 时间:2026-08-10
-
- c++11 正则表达式 std::regex写法与异常处理
- 时间:2026-08-10
-
- 多线程c语言实现 pthread创建同步与完整示例
- 时间:2026-08-10
-
- vc 正则表达式 std::regex与Boost.Regex选择
- 时间:2026-08-10
-
- c++ 正则表达 regex匹配提取替换示例
- 时间:2026-08-10
-
- c的多线程怎么实现原理 pthread原理与加锁示例
- 时间:2026-08-10
-
- 正则表达式c语言
- 时间:2026-08-10
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15