首页 > 其他分享 >C语言的正则表达式

C语言的正则表达式

时间:2024-09-10 23:37:08浏览次数:7  
标签:regex const 正则表达式 pmatch C语言 int rm REG

C标准库不支持正则表达式,但大部分Linux发行版本都带有第三方的正则表达式函数库。
以常见的<regex.h>为例:

/*
regcomp将正则表达式编译成适合后续regexec函数搜索的形式
preg指向模式缓冲区,传出参数
regex字符串,传入参数
cflag决定编译类型,可位或:
  -REG_EXTENDED扩展正则表达式语法
  -REG_ICASE不区分大小写
  -REG_NOSUB不存储匹配结果
  -REG_NEWLINE识别换行符
*/
int regcomp(regex_t *preg, const char *regex, int cflags);
/*
regexec使用编译好的模式串匹配字符串,nmatch和pmatch用来提供匹配上的位置信息
其中regmatch_t:
typedef struct {
  regoff_t rm_so;  //匹配的起始
  regoff_t rm_eo;  //匹配的结尾
} regmatch_t;
eflags位或,可位或:
  -REG_NOTBOL
  -REG_NOTEOL
  -REG_STARTEND
*/
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
/*
regerror将regcomp和regexec返回的错误码转为错误信息字符串
errorcode是regcomp和regexec的返回值
errbuf是接收错误信息字符串的缓存区,传出参数
*/
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);
/*清空regex_t结构体内容*/
void regfree(regex_t *preg);

使用的例子:

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <regex.h>
#define ARRAY_SIZE(arr) (sizeof((arr)) / sizeof((arr)[0]))
static const char *const str = "1) John Driverhacker;\n2) John Doe;\n3) John Foo;\n";
static const char *const re = "John.*o";
int main()
{
  static const char *s = str;
  regex_t regex;
  regmatch_t pmatch[1];
  regoff_t off, len;
  if(regcomp(&regex, re, REG_NEWLINE))
    exit(EXIT_FAILURE);
  printf("String = \"%s\"\n", str);
  printf("Matches:\n");
  for(int i = 0; ; i++) {
    if(regexec(&regex, s, ARRAY_SIZE(pmatch), pmatch, 0))
      break;
    off = pmatch[0].rm_so + (s - str);
    len = pmatch[0].rm_eo - pmatch[0].rm_so;
    printf("#%d:\n", i);
    printf("offset = %jd; length = %jd\n", (intmax_t) off, (intmax_t) len);
    printf("substring = \"%.*s\"\n", len, s + pmatch[0].rm_so);
    s += pmatch[0].rm_eo;
  }
  exit(EXIT_SUCCESS);
}

标签:regex,const,正则表达式,pmatch,C语言,int,rm,REG
From: https://www.cnblogs.com/songlh424/p/18407120

相关文章

  • C语言程序设计(初识C语言后部分)
    晴天也会突然下暴雨,温柔的人也会不开心。二十一,实用调试技巧1.什么是bug?2.调试是什么?有多重要?3.debug和release的介绍4.vs环境调试介绍5.如何写出好(易于调试)的代码6.编程常见的错误1.什么是bug?就是使计算机程序或者计算机硬件出现问题,不能正常运行的地方称为bug(缺陷......
  • c语言--力扣简单题目(删除排序链表中的重复元素)讲解
    题目如下:给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。示例1:输入:head=[1,1,2]输出:[1,2]示例2:输入:head=[1,1,2,3,3]输出:[1,2,3]提示:链表中节点数目在范围[0,300]内-100<=Node.val<=100题目数据保......
  • c语言文件操作
      目录1、文件操作概述2、文件的打开与关闭3、文件的顺序读取与写入3.1fputs、fgets函数3.2 fscanf、fprintf函数4、文件的随机读取与写入4.1fseek函数4.2ftell函数  4.3 rewind函数5、文件读取结束的判定 1、文件操作概述    每个被使⽤......
  • 磁盘映射(C语言)
            目录一、背景介绍二、磁盘映射技术概述  1.磁盘映射原理  2.磁盘映射的优势三、C语言实现磁盘映射        磁盘映射技术在C语言中的应用能够极大地提高文件操作的效率。本文将详细介绍磁盘映射的概念、如何在C语言中实现磁盘映射,并通过......
  • C语言程序设计——数组(二)
    一、字符数组1.1字符数组的定义定义方法与数组(一)介绍的类似。用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。1.2字符数组的初始化对字符数组初始化,最容易理解的方式是逐个字符赋给数组中各元素。注:①如果在定义字符数组时不进行初始化,则数组中各......
  • C语言程序设计(循环控制)
    一、概述在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。二、goto语句以及用goto语句构成循环goto语句为无条件转向语句,它的一般形式为goto语句标号;语句标号用标识符表示,它的定名规......
  • Ts+正则表达式格式化时间
     1.padStart:padStart(targetLength,padString):用另一个字符串填充当前字符串(如果需要会重复填充),直到达到给定的长度。填充是从当前字符串的开头开始的。最后返回一个新的字符串。targetLength:当前str填充后的长度。如果该值小于或等于str.length,则会直接返回当前str。pa......
  • C语言13--结构体
    结构体基本概念        C语言提供了众多的基本类型,但现实生活中的对象一般都不是单纯的整型、浮点型或字符串,而是这些基本类型的综合体。比如一个学生,典型地应该拥有学号(整型)、姓名(字符串)、分数(浮点型)、性别(枚举)等不同侧面的属性,这些所有的属性都不应该被拆分开来,而是......
  • c语言·其四
    sizeofsizeof是关键字,作用:某个类型有几个字节printf("%d\n",sizeof(char));  1printf("%d\n",sizeof(shortint));  2printf("%d\n",sizeof(int));   4printf("%d\n",sizeof(longint));  4printf("%d\n",sizeof(__int64)......
  • C语言阶段练习题
    题目一:(25分)题目描述:输入终值,输出所有能被7整除的数值及其和数据展示: 代码展示:#include<stdio.h>#include<string.h>#include<stdlib.h>intmain(intargc,constchar*argv[]){inta,sum=0,m=0;         //定义输入值,求和值,以及判断换......