正则表达式

正则表达式

基本概念

字符 含义 举例
. 匹配任意一个字符 如“abc.”,可以匹配abc2、abcd、abc%等
[] 匹配括号中的任意一个字符 如“[abc]d”,可以匹配ad、bd、cd
- 在[]括号范围内表示范围 如“[0-9]”,表示匹配0至9中任意一个数字
^ 位于[]内开头,匹配除括号内字符以外的任意字符 如“[^ab]”,表示匹配除了a、b之外的其他字符
? 紧跟其前面的单元匹配零次或者一次
+ 紧跟其前面的单元匹配一次或者多次
* 紧跟其前面的单元匹配零次或者多次
{N} 紧跟其前面的单元匹配精确的N次 如“k{3}”,表示精确匹配kkk。
{N,} 紧跟其前面的单元匹配至少N次
{,M} 紧跟其前面的单元匹配最多M次
{N,M} 紧跟其前面的单元匹配至少N次,最多M次
^ 匹配行首的位置
$ 匹配行尾的位置
\< 匹配单词开头的位置
\> 匹配单词结尾的位置
\b 匹配单词的边界 如“\bA.{3}T\b”,表示匹配类似A123t、AXYZT等单词
\B 匹配非单词边界 如“\Bh\B”,表示匹配的h不在单词边界,如host则不符合,因为h在单词的边界,而she则符合匹配。
| 连接两个子表达式,表示或的关系 如“n(ei|mn)”,匹配nei或者nmn
() 将正则表达式部分组成分组,可引用分组
\ 转义字符
\d 匹配数字字符,效果同[0-9]
\D 匹配非数字字符,效果同[0-9],或者同[\d]
\w 匹配单词字符,效果同[_a-zA-Z0-9]
\W 匹配非单词字符
\s 匹配空白字符,效果同[ \t\n\r],注意括号中包括空格
\S 匹配非空白字符
() 分组、子模式(subpattern)
\1、\2… 通过后向引用重用捕获内容 如“(the)(china people) \2 \1”,这里的第一个分组是the、第二个分组是china people,则\1表示第一个分组,\2表示第二个分组。
(?:name) 非捕获分组 如“(?:the|THE)”,非捕获分组不会将其存储在内存,无法后向引用

C语言实现正则表达式

标准的C与C++都不支持正则表达式,但是在某些场景下,正则表达式存在可以为程序带来便利。

在C语言中,一些库函数可以帮助我们实现在C中使用正则表达式的诉求。

以下介绍在Linux环境下C语言中处理正则表达式的常用函数。

regcomp函数

函数原型为:

#include<regex.h>
int regcomp(regex_t *compiled, const char *pattern, int cflags);

函数作用:将指定的正则表达式格式pattern编译成一种特定的数据格式compiled,这样可以使得正则表达式的匹配更加有效。函数执行成功返回0。

参数说明:

  1. regex_t是一个结构体数据类型,用来存放编译后的正则表达式,其成员re_nsub用来存储正则表达式组合的子正则表达式的个数。

  2. pattern指向要编译的正则表达式字符串。

  3. cflags是标志位。可以取值为:

    a、REG_EXTENDED:以功能更加强大的扩展正则表达式的方式进行匹配

    b、REG_ICASE:匹配字母时,忽略大小写;

    c、REG_NOSUB:不用存储匹配后的结果;

    d、REG_NEWLINE:识别换行符,则符号^与$可以分别从行首与行尾开始匹配。

###regexec函数

函数原型为:

#include<regex.h>
int regexec(regex_t *compiled, char *string, size_t nmatch, regmatch_t matchptr[], int eflags);

函数作用:使用正则表达式执行匹配目标文本。如果在调用函数regcomp编译正则表达式时,没有指定cflags标志位为REG_NEWLINE,则默认情况下忽略换行符,即将整个文本内的字符串当作一个整体来处理。函数执行成功返回0。

参数说明:

  1. compiled是使用函数regcomp编译好的正则表达式;
  2. string是需要匹配的目标字符串;
  3. nmatch是regmatch_t结构体数组的长度;
  4. matchptr是regmatch_t类型的结构体数组,存放匹配字符串的位置信息;
  5. eflags取值为REG_NOTBOL,即让特殊字符^无作用,eflags取值为REG_NOTEOL,即让特殊字符$无作用。

regmatch_t是一个结构体数据类型:

typedef struct {
   
    regoff_t rm_so
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值