C语言使用正则表达式(常规方法)
用c语言实现正则表达式

用c语言实现正则表达式在C语言中,正则表达式通常使用POSIX标准库中的头文件进行操作。
以下是一个简单的示例,说明如何使用C语言和POSIX正则表达式库来匹配字符串是否符合某个正则表达式。
```cinclude <>include <>int main() {regex_t regex;int ret;char pattern = "^[a-zA-Z0-9]$"; // 匹配只包含字母和数字的字符串 char input = "abc123";char error[100];// 编译正则表达式ret = regcomp(®ex, pattern, REG_EXTENDED);if(ret) {fprintf(stderr, "Could not compile regex\n");return 1;}// 执行匹配ret = regexec(®ex, input, 0, NULL, 0);if(!ret) {printf("Match\n");} else if(ret == REG_NOMATCH) {printf("No match\n");} else {regerror(ret, ®ex, error, sizeof(error));fprintf(stderr, "Regex match failed: %s\n", error); return 1;}// 释放正则表达式regfree(®ex);return 0;}```在这个示例中,我们首先使用`regcomp`函数编译一个正则表达式。
然后,我们使用`regexec`函数来执行匹配。
如果匹配成功,我们打印"Match"。
C语言中的正则表达式使用

C语⾔中的正则表达式使⽤ 正则表达式,⼜称正规表⽰法、常规表⽰法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的⼀个概念。
正则表达式是使⽤单个字符串来描述、匹配⼀系列符合某个句法规则的字符串。
--来⾃百度百科 在c语⾔中,⽤regcomp、regexec、regfree 和regerror处理正则表达式。
处理正则表达式分三步:1. 编译正则表达式,regcomp;2. 匹配正则表达式,regexec;3. 释放正则表达式,regfree。
四个函数的详细解释:int regcomp(regex_t *preg, const char *regex, int cflags);函数说明: Regcomp将正则表达式字符串regex编译成regex_t的形式,后续regexec以此进⾏搜索。
参数说明: Preg:⼀个regex_t结构体指针。
Regex:正则表达式字符串。
Cflags:是下边四个值或者是他们的或(|)运算。
REG_EXTENDED:使⽤POSIX扩展正则表达式语法解释的正则表达式。
如果没有设置,基本POSIX正则表达式语法。
REG_ICASE:忽略字母的⼤⼩写。
REG_NOSUB:不存储匹配的结果。
REG_NEWLINE:对换⾏符进⾏“特殊照顾”,后边详细说明。
返回值: 0:表⽰成功编译; ⾮0:表⽰编译失败,⽤regerror查看失败信息int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);函数说明: Regexec⽤来匹配正则⽂本。
参数说明: Preg:由regcomp编译好的regex_t结构体指针, String:要进⾏正则匹配的字符串。
Nmatch:regmatch_t结构体数组的⼤⼩ Pmatch:regmatch_t结构体数组。
c语言正则表达式

c语⾔正则表达式%[ ] 的⽤法: %[ ] 表⽰要读⼊⼀个字符集合 , 如果 [ 后⾯第⼀个字符是 ”^” ,则表⽰反意思。
[ ] 内的字符串可以是 1 或更多字符组成。
空字符集( %[] )是违反规定的,可导致不可预知的结果。
%[^] 也是违反规定的。
%[a-z] 读取在 a-z 之间的字符串,如果不在此之前则停⽌,如char s[]="hello, my friend” ; // 注意 : , 逗号在不 a-z 之间sscanf( s, “%[a-z]”, string ) ; // string=hello%[^a-z] 读取不在 a-z 之间的字符串,如果碰到 a-z 之间的字符则停⽌,如char s[]="HELLOkitty” ; // 注意 : , 逗号在不 a-z 之间sscanf( s, “%[^a-z]”, string ) ; // string=HELLO%*[^=] 前⾯带 * 号表⽰不保存变量。
跳过符合条件的字符串。
char s[]="notepad=1.0.0.1001" ;char szfilename [32] = "" ;int i = sscanf( s, "%*[^=]", szfilename ) ; // szfilename=NULL, 因为没保存int i = sscanf( s, "%*[^=]=%s", szfilename ) ; // szfilename=1.0.0.1001%40c 读取 40 个字符%[^=] 读取字符串直到碰到 ’=’ 号, ’^’ 后⾯可以带更多字符 , 如:char s[]="notepad=1.0.0.1001" ;char szfilename [32] = "" ;int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad如果参数格式是: %[^=:] ,那么也可以从 notepad:1.0.0.1001 读取 notepad使⽤例⼦:char s[]="notepad=1.0.0.1001" ;char szname [32] = "" ;char szver [32] = “” ;sscanf( s, "%[^=]=%s", szname , szver ) ; // szname=notepad, szver=1.0.0.1001总结: %[] 有很⼤的功能,但是并不是很常⽤到,主要因为:1 、许多系统的 scanf 函数都有漏洞 . ( 典型的就是 TC 在输⼊浮点型时有时会出错 ).2 、⽤法复杂 , 容易出错 .3 、编译器作语法分析时会很困难 , 从⽽影响⽬标代码的质量和执⾏效率 .第 3 点最致命,越复杂的功能往往执⾏效率越低下。
C语言中的正则表达式应用

C语言中的正则表达式应用在C语言中,正则表达式是一种非常强大的工具,可以用来匹配、查找和替换字符串。
在C语言中,正则表达式的应用主要依赖于正则表达式库,比如PCRE和Boost.Regex等。
正则表达式在C语言中的应用主要包括以下几个方面:1. 匹配字符串:使用正则表达式可以对字符串进行匹配,判断字符串是否符合特定的模式。
比如可以使用正则表达式来检查一个字符串是否为合法的邮箱地址、IP地址或者电话号码等。
2. 查找字符串:正则表达式还可以用来查找字符串中符合某种模式的子串。
比如可以使用正则表达式在一个文本文件中查找所有的网址链接或者手机号码等。
3. 替换字符串:除了匹配和查找字符串,正则表达式还可以用来替换字符串中的特定子串。
比如可以使用正则表达式将一个文本文件中的所有日期格式替换成另一种日期格式。
在C语言中使用正则表达式通常需要引入相应的正则表达式库,然后利用库提供的函数进行操作。
下面以PCRE库为例,演示如何在C语言中使用正则表达式:首先需要包含PCRE库的头文件:```c#include <pcre.h>```初始化PCRE库并编译正则表达式:```cconst char *regex = "([0-9]+)";pcre *re;const char *error;int erroffset;re = pcre_compile(regex, 0, &error, &erroffset, NULL);if (!re) {printf("PCRE compilation error\n");return -1;}```使用正则表达式匹配字符串:```cchar text[] = "12345abcde67890";int rc;int ovector[3];rc = pcre_exec(re, NULL, text, strlen(text), 0, 0, ovector, 3); if (rc < 0) {switch(rc) {case PCRE_ERROR_NOMATCH:printf("No match\n");break;default:printf("Matching error\n");break;}}else {printf("Matched substring: %.*s\n", ovector[1] - ovector[0], text + ovector[0]);}```上面的代码演示了如何使用PCRE库在C语言中进行正则表达式匹配。
c语言用正则表达式

c语言用正则表达式
C语言正则表达式
正则表达式是一种特殊的字符串模式,可以用来搜索、替换或操作文本。
它们用于在文本中查找特定的字符序列,以及对文本进行替换和修改操作。
正则表达式被广泛应用于文本处理、数据挖掘、搜索和自然语言处理等领域。
C语言使用正则表达式时,常用到 GNU 正则表达式库,它是由GNU 计划发布的一个开放源码(Open Source)的正则表达式函数库。
GNU 正则表达式库提供了用于字符串的搜索、替换等操作的函数,可以用于 C 语言程序中,从而使 C 语言程序支持正则表达式。
GNU 正则表达式库中提供了 11 个主要的函数,它们用来执行模式匹配和替换操作,这些函数的详细介绍如下:
1. regcomp():用于将一个正则表达式转换为机器可识别的形式;
2. regexec():用于在一个指定的字符串中搜索一个模式;
3. regsub():用于在一个指定的字符串中替换一个模式;
4. regerror():用于格式化和打印错误消息;
5. regfree():用于释放之前使用 regcomp() 函数的内存;
6. regex_t:用于存放正则表达式的结构体;
7. regexec_t:用于存放搜索模式匹配结果的结构体;
8. regmatch_t:用于存放模式匹配位置的结构体;
9. regoff_t:用于存放正则表达式的位置;
10. reg_syntax:用于定义模式语法的常量;
11. size_t:用于存放字符串长度的类型。
GNU 正则表达式库为 C 语言程序提供了一个强大的工具,可以用来搜索、替换和操作文本,从而提高程序的开发效率。
C语言正则表达式用法

C语言正则表达式用法正文:C语言正则表达式用法正则表达式是一种强大的模式匹配工具,在编程中被广泛应用于字符串处理、文本分析等各个领域。
C语言作为一种常用的程序设计语言,也提供了正则表达式的支持。
本文将介绍C语言中正则表达式的用法,包括正则表达式的基本语法、常用的函数和示例应用。
一、基本语法1.字符匹配正则表达式由普通字符和特殊字符组成,其中特殊字符具有特殊的含义。
最基本的正则表达式就是用普通字符进行匹配。
例如,正则表达式“hello”可以用于匹配字符串中的“hello”。
2.元字符除了普通字符,正则表达式还包含一些特殊的元字符,用于匹配多个字符或特殊的字符类型。
常见的元字符包括:- '.':匹配任意字符;- '*':匹配0个或多个前面的字符;- '+':匹配1个或多个前面的字符;- '?':匹配0个或1个前面的字符;- '^':匹配行首;- '$':匹配行尾;3.字符类为了匹配某个字符集合中的任意一个字符,可以使用字符类。
字符类用方括号括起来,其中列出了要匹配的字符。
例如,正则表达式“[abc]”可以用于匹配字符串中的任意一个字符“a”、“b”或“c”。
4.转义字符当需要匹配正则表达式中的特殊字符本身时,可以使用反斜杠来进行转义。
例如,正则表达式“\?\.com”可以用于匹配字符串“?.com”。
5.预定义字符类C语言提供了一些预定义的字符类,可以用于匹配一些常见的字符类型,例如字母、数字、空白字符等。
常见的预定义字符类包括: - '\w':匹配任意字母、数字或下划线;- '\d':匹配任意数字;- '\s':匹配任意空白字符;- '\b':匹配单词边界;二、常用函数C语言提供了一系列用于正则表达式操作的函数,可以方便地进行匹配、替换和提取等操作。
c语言 正则 表达式

c语言正则表达式正则表达式是一种强大的文本模式匹配工具,它在许多编程语言中都得到了广泛应用,包括C语言。
本文将介绍在C语言中如何使用正则表达式进行文本匹配。
正则表达式是一种用于描述字符串模式的语法规则。
它可以按照特定的模式匹配字符串中的内容,从而实现文本的查找、替换、分割等操作。
在C语言中,可以使用正则表达式相关的函数库来实现这些功能。
C语言中常用的正则表达式函数库是POSIX标准的regex.h。
这个库提供了一系列函数,包括编译正则表达式、匹配正则表达式、释放资源等。
下面我们将介绍一些常用的函数及其用法。
需要包含regex.h头文件:```c#include <regex.h>```接下来,需要定义一个regex_t类型的变量来存储编译后的正则表达式:```cregex_t regex;```然后,使用regcomp函数编译正则表达式:```cint regcomp(regex_t *preg, const char *pattern, int cflags);```其中,preg为指向regex_t类型变量的指针,pattern为正则表达式的字符串,cflags为编译选项,可以指定不同的匹配方式。
编译成功后,可以使用regexec函数进行正则表达式的匹配:```cint regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);```其中,preg为指向regex_t类型变量的指针,string为待匹配的字符串,nmatch为最多匹配的次数,pmatch为存储匹配结果的结构体数组,eflags为匹配选项。
匹配成功后,可以通过pmatch数组获取匹配结果的位置信息,从而实现提取、替换等操作。
需要使用regfree函数释放资源:```cvoid regfree(regex_t *preg);```通过上述函数的组合使用,可以在C语言中实现对文本的正则表达式匹配。
c语言中的正则表达式

c语言中的正则表达式C语言中的正则表达式正则表达式是一种强大的模式匹配工具,常用于字符串的匹配、查找和替换。
在C语言中,我们可以使用正则表达式库来实现对字符串的高效处理。
本文将介绍C语言中的正则表达式的基本语法和用法,并通过示例代码展示其在实际应用中的作用。
一、正则表达式的基本语法C语言中的正则表达式使用的是POSIX标准的正则表达式语法。
下面是一些常用的正则表达式元字符和操作符:1. 字符类- []:匹配方括号中的任意一个字符,例如[abc]可以匹配字符a、b或c。
- [^]:匹配除方括号中的字符以外的任意一个字符,例如[^abc]可以匹配除了a、b和c以外的任意字符。
- -:表示字符范围,例如[a-z]表示匹配任意小写字母。
2. 重复次数- *:匹配前面的表达式零次或多次。
- +:匹配前面的表达式一次或多次。
- ?:匹配前面的表达式零次或一次。
- {n}:匹配前面的表达式恰好n次。
- {n,}:匹配前面的表达式至少n次。
- {n,m}:匹配前面的表达式至少n次但不超过m次。
3. 特殊字符- .:匹配任意一个字符。
- \:转义字符,用于匹配特殊字符本身,例如\.匹配点字符。
- ^:匹配行的开始位置。
- $:匹配行的结束位置。
二、C语言中的正则表达式库在C语言中,我们可以使用正则表达式库来实现对字符串的匹配、查找和替换。
常用的正则表达式库有POSIX标准库和PCRE库。
1. POSIX标准库POSIX标准库提供了一系列函数来处理正则表达式,包括编译正则表达式、执行匹配和释放资源等。
常用的函数有:- regcomp:编译正则表达式。
- regexec:执行正则表达式匹配。
- regfree:释放已编译的正则表达式。
下面是一个使用POSIX标准库的示例代码:```c#include <regex.h>#include <stdio.h>int main() {regex_t regex;int ret;// 编译正则表达式ret = regcomp(®ex, "a.*b", REG_EXTENDED); if (ret != 0) {printf("正则表达式编译失败\n");return -1;}// 执行匹配ret = regexec(®ex, "abc", 0, NULL, 0);if (ret == 0) {printf("匹配成功\n");} else if (ret == REG_NOMATCH) {printf("未匹配到结果\n");} else {printf("匹配失败\n");}// 释放资源regfree(®ex);return 0;}```2. PCRE库PCRE库是Perl Compatible Regular Expressions的缩写,是一个功能强大的正则表达式库,提供了更多的特性和功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言使用正则表达式据说一个好的程序员是会使用DB和Regular Expression的程序员,可见两者是多么重要。
正则表达式是能极大地提高工作效率的工具,使用过Linux下各种具备RE特性的工具的人一定对此深有感触。
很多语言都支持RE,用的最多的当然是脚本,其中以perl最盛。
不过,用C语言来用RE不是很多见,但是有时候也很有用,我最近也是看到别人说道这个,所以搜了一些资料加上自己的体会来说一说RE在C语言里的应用。
C语言本身不具备RE特性,但是有很多库,在Linux下你可以很方便的使用regex.h提供的库。
我先贴一段代码展示一下RE在C语言里是怎么用的1 #include<stdio.h>2 #include<sys/types.h>3 #include<regex.h>4 #include<memory.h>5 #include<stdlib.h>67 int main(){89 char*bematch ="********************";10 char*pattern ="h{3,10}(.*)@.{5}.(.*)";11 char errbuf[1024];12 char match[100];13 regex_t reg;14 int err,nm =10;15 regmatch_t pmatch[nm];1617 if((err=regcomp(®,pattern,REG_EXTENDED))<0){18 regerror(err,®,errbuf,sizeof(errbuf));19 printf("err:%s\n",errbuf);20 }2122 err =regexec(®,bematch,nm,pmatch,0);2324 if(err ==REG_NOMATCH){25 printf("no match\n");26 exit(-1);27 }else if(err){28 regerror(err,®,errbuf,sizeof(errbuf));29 printf("err:%s\n",errbuf);30 exit(-1);31 }3233 for(int i=0;i<10 &&pmatch[i].rm_so!=-1;i++){34 int len =pmatch[i].rm_eo-pmatch[i].rm_so;35 if(len){36 memset(match,'\0',sizeof(match));37 memcpy(match,bematch+pmatch[i].rm_so,len);38 printf("%s\n",match);39 }40 }41 return0;42 }我打算看看一个邮件地址是否匹配我所提供的pattern。
这个邮件地址是******************** patern为"h{3,10}(.*)@.{5}.(.*)"我们希望匹配一个以3个h字符接着为任意字符串(可以为空)直到遇到一个@,然后接5个任意的字符和一个.号,最后再接一个字符串(可以为空),我们运行得到的结果是********************ericchdcom我们发现,这个邮件地址被匹配了,第一行输出了,第二行和第三行分别输出的是我们希望得到的匹配的一部分,也就是在pattern中用括号括起来的部分。
在这里我们还发现,在C语言里使用RE表达式的时候和通常的UNIX一般的RE表达式有区别:第一、\{\}和\(\)需要改成{}和(),因为在C语言反斜杠是转移字符用的第二、.不需要转义,不想UNIX的RE那样需要\.,但是?和*我没有找到该怎么用下面贴上对以上所用函数的一些解释regex的使用需要用到以下几个函数。
(定义在/usr/include/regex.h文件中)int regcomp (regex_t *compiled, const char *pattern, i nt cflags) int regexec (regex_t *compiled, char *stri ng, size_t nmatch, regmatch_t matchptr [], int eflags )void regfree (regex_t *compiled)size_t regerror (int errcode, regex_t *compiled, char *buffer, size_t length)1.int regcomp (regex_t *compiled, const char *pattern, int cflags)这个函数把指定的规则表达式pattern编译成一种特定的数据格式compiled,这样可以使匹配更有效。
函数regexec 会使用这个数据在目标文本串中进行模式匹配。
执行成功返回0。
regex_t 是一个结构体数据类型,用来存放编译后的规则表达式,它的成员re_nsub 用来存储规则表达式中的子规则表达式的个数,子规则表达式就是用圆括号包起来的部分表达式。
pattern 是指向我们写好的规则表达式的指针。
cflags 有如下4个值或者是它们或运算(|)后的值:REG_EXTENDED 以功能更加强大的扩展规则表达式的方式进行匹配。
REG_ICASE 匹配字母时忽略大小写。
REG_NOSUB 不用存储匹配后的结果。
REG_NEWLINE 识别换行符,这样'$'就可以从行尾开始匹配,'^'就可以从行的开头开始匹配。
2. int regexec (regex_t *compiled, char *string, size_ t nmatch, regmatch_t matchptr [], int eflags)当我们编译好规则表达式后,就可以用regexec 匹配我们的目标文本串了,如果在编译规则表达式的时候没有指定cflags的参数为REG_NEWLINE,则默认情况下是忽略换行符的,也就是把整个文本串当作一个字符串处理。
执行成功返回0。
regmatch_t 是一个结构体数据类型,成员rm_so 存放匹配文本串在目标串中的开始位置,rm_eo 存放结束位置。
通常我们以数组的形式定义一组这样的结构。
因为往往我们的规则表达式中还包含子规则表达式。
数组0单元存放主规则表达式位置,后边的单元依次存放子规则表达式位置。
compiled 是已经用regcomp函数编译好的规则表达式。
string 是目标文本串。
nmatch 是regmatch_t结构体数组的长度。
matchptr regmatch_t类型的结构体数组,存放匹配文本串的位置信息。
eflags 有两个值REG_NOTBOL 按我的理解是如果指定了这个值,那么'^'就不会从我们的目标串开始匹配。
总之我到现在还不是很明白这个参数的意义,原文如下:If this bit is set, then the beginning-of-line operat or doesn't match the beginning of thestring (presumably because it's not the beginning ofa line).If not set, then the beginning-of-line opera tordoes match the beginning of the string.REG_NOTEOL 和上边那个作用差不多,不过这个指定结束end of line。
3. void regfree (regex_t *compiled)当我们使用完编译好的规则表达式后,或者要重新编译其他规则表达式的时候,我们可以用这个函数清空compiled指向的regex_t结构体的内容,请记住,如果是重新编译的话,一定要先清空regex_t结构体。
4. size_t regerror (int errcode, regex_t *compiled, ch ar *buffer, size_t length)当执行regcomp 或者regexec 产生错误的时候,就可以调用这个函数而返回一个包含错误信息的字符串。
errcode 是由regcomp 和regexec 函数返回的错误代号。
compiled 是已经用regcomp函数编译好的规则表达式,这个值可以为NULL。
buffer 指向用来存放错误信息的字符串的内存空间。
length 指明buffer的长度,如果这个错误信息的长度大于这个值,则regerror 函数会自动截断超出的字符串,但他仍然会返回完整的字符串的长度。
所以我们可以用如下的方法先得到错误字符串的长度。
size_t length = regerror (errcode, compiled, NULL, 0);regex虽然简单易用,但对正则表达式的支持不够强大,中文处理也有问题(经过试验可以引用vi的一些正则表达式编写例子),PCRE是另一个选择PCRE ()还有一份不错的资料/docs/C/Pattern-Matching.html#Patter n-Matching。