c语言 - 正则表达式

c语言 - 正则表达式,regex.hpcre.h。前者为 POSIX 正则(BRE、ERE),后者为 PCRE 正则。

BRE/ERE

regex.h是Linux中的一个正则头文件,提供的常用函数有regcomp()regexec()regfree()regerror()

C语言中使用正则表达式一般分为三步

  • 编译正则表达式 regcomp()
  • 匹配正则表达式 regexec()
  • 释放正则表达式 regfree()

函数原型
int regcomp(regex_t *compiled, const char *pattern, int cflags);

  • compiled:输出参数,保存编译好的 regex 模式;
  • pattern:输入参数,regex 模式;
  • cflags:输入参数,编译选项;
    • REG_EXTENDED扩展正则
    • REG_ICASE忽略大小写
    • REG_NEWLINE多行模式
    • REG_NOSUB不存储匹配结果
  • 返回值:编译成功,返回 0。

regcomp()默认是单行模式,即.匹配所有字符,^$匹配输入序列开始、结束位置;
REG_NEWLINE多行模式,即.匹配除\n外的任意字符,^$匹配行头、行尾位置。

对于模式^.*$\n^.*$,字符串www.zfl9.com\nwww.google.com
POSIX 正则的多行模式无法匹配,而 PCRE 正则的多行模式正常匹配。

int regexec(regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr[], int eflags);

  • compiled:输入参数,已编译的regex模式
  • string:输入参数,需要匹配的文本
  • nmatch:输入参数,matchptr的长度
  • matchptr:输出参数,保存匹配到的regmatch_t对象
  • eflags:输入参数,编译选项
  • 返回值:匹配成功,返回0

结构体regmatch_t

void regfree(regex_t *compiled);

  • compiled:输入参数,不需要使用的regex模式

size_t regerror(int errcode, regex_t *compiled, char *buffer, size_t length);

  • 当执行regcomp()或者regexec()产生错误的时候,调用这个函数可以返回一个包含错误信息的字符串
  • errcode:输入参数,regcomp()、regexec()返回的错误代号
  • compiled:输入参数,已编译好的regex模式,可以为NULL
  • buffer:输出参数,保存相关错误信息的字符串描述
  • length:输入参数,指明buffer的长度
  • 返回值:返回错误描述信息的长度

re_posix.c

最后一个例子可以发现,POSIX 的正则并不支持非贪婪匹配!

PCRE

PCRE(Perl Compatible Regular Expressions)即 Perl 兼容正则表达式,它提供与 Perl5 相同的正则语法和语义,简单、灵活、强大是 Perl5 正则的特点。

安装 pcre 库

  • CentOS/RHEL:yum -y install pcre-devel
  • ArchLinux:pacman -S --need pcre

re_pcre.c

小提示

默认模式、单行模式、多行模式

  • 默认模式:^$匹配输入序列的边界位置,.匹配除行结束符外的任意字符;
  • 单行模式:^$匹配输入序列的边界位置,.匹配任意字符;
  • 多行模式:^$匹配任意一行的边界位置,.匹配除行结束符外的任意字符。

简单的说:单行模式改变.的意义,多行模式改变^$的意义

BRE、ERE、PCRE 对比

一般来说,我们使用 PCRE 正则比较多,比如 nginx 的 rewrite 模块就是使用的 PCRE 库。
如果需要了解更多关于 PCRE 正则的知识,请前往 - Java - 正则库,与 Perl5 正则较接近。