C正则表达式

合集下载

用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(&regex, pattern, REG_EXTENDED);if(ret) {fprintf(stderr, "Could not compile regex\n");return 1;}// 执行匹配ret = regexec(&regex, input, 0, NULL, 0);if(!ret) {printf("Match\n");} else if(ret == REG_NOMATCH) {printf("No match\n");} else {regerror(ret, &regex, error, sizeof(error));fprintf(stderr, "Regex match failed: %s\n", error); return 1;}// 释放正则表达式regfree(&regex);return 0;}```在这个示例中,我们首先使用`regcomp`函数编译一个正则表达式。

然后,我们使用`regexec`函数来执行匹配。

如果匹配成功,我们打印"Match"。

c语言正则表达式

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语言中,正则表达式是一种非常强大的工具,可以用来匹配、查找和替换字符串。

在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语⾔正则表达式在很多⼈看来,正则表达式看上去古怪且复杂,因此往往不想去触及或使⽤。

如果我们抛开这种“畏难”⼼理,在经过循序渐进地学习之后,就会发现这些复杂的表达式其实写起来还是相当简单的。

⼀旦它被你所“驯服”,就可利⽤正则表达式把原需数⼩时⾟苦且易错的⽂本处理⼯作压缩在⼏分钟(甚⾄⼏秒钟)内完成。

正则表达式定义正则表达式(regular expression)是Linux系统中⼀种⾮常重要的字符串搜索模式,是⼀组规则字符的集合。

这些规则字符能够组成我们所需要的搜索规则,效率⾼、功能强,可以极⼤地简化处理字符串时的复杂度。

在很多Linux⼯具(sed、grep、find等)和脚本语⾔(awk、perl等)中都有着重要的地位。

当我们在编写字符串相关的应⽤程序时,掌握正则表达式会起到事半功倍的效果。

C中的正则表达式标准C和C++都不⽀持正则表达式,但是千万不要以为正则表达式就只是Perl、Python、Bash等脚本语⾔的专利,作为C语⾔程序员,⽤户同样可以在⾃⼰的程序中运⽤正则表达式,只是需要⼀些函数库辅助C/C++程序员来完成这⼀功能。

许多Linux发⾏版本都带有POSIX函数库,下⾯我将以POSIX函数库中的Regex系列函数来说明在Linux c下如何使⽤正则表达式。

⾸先要⽤Regcomp()函数对它进⾏编译,将其转化为Regex_t结构。

因为⼀个正则表达式需要编译成⼀个特定的数据结构才能被后续的函数使⽤。

Regcomp()函数的原型是:int Regcomp(regex_t *preg, const char *regex, int cflags)参数preg指向⼀个声明为regex_t的数据结构,⽤来保存编译结果。

参数regex为要编译的正则表达式字符串。

参数cflags是编译开关,编译开关可以控制规则⽣成的特性,如REG_EXTEND代表使⽤扩展正则表达式模式;REG_ICASE表⽰对规则中字符串不区分⼤⼩写;REG_NOSUB只检查是否有符合规则的⼦串。

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语言中使用正则表达式去掉特殊字符,以及在实际应用中的一些注意事项。

一、正则表达式的基本概念在C语言中,我们可以使用正则表达式库来进行字符串的匹配和替换。

正则表达式是一个特殊的字符序列,它可以帮助我们在字符串中进行模式匹配和替换操作。

在C语言中,常见的正则表达式库包括PCRE、Boost.Regex等。

这些库提供了丰富的正则表达式功能,可以满足我们在实际开发中的需求。

二、去掉特殊字符的方法在C语言中,我们可以使用正则表达式来去掉字符串中的特殊字符。

下面是一个简单的示例代码:```c#include <stdio.h>#include <regex.h>int m本人n() {char input[] = "Hello, World! 123 ###";regex_t regex;rep(regex, "[^a-zA-Z0-9]", 0);regfree(regex);return 0;}```在这段代码中,我们首先定义了一个字符串input,然后定义了一个regex_t类型的正则表达式对象regex。

我们使用rep函数编译了一个正则表达式“[^a-zA-Z0-9]”,这个正则表达式表示匹配除了字母和数字之外的任意字符。

我们使用regfree函数释放了正则表达式对象的内存。

三、注意事项在使用正则表达式去掉特殊字符时,需要注意一些事项。

正则表达式的语法和特性可能会有一定的学习成本,需要我们熟悉和掌握。

正则表达式在处理大量数据时可能会影响性能,需要注意优化和性能测试。

另外,一些特殊字符可能在正则表达式中具有特殊含义,需要进行转义处理。

总结通过本文的介绍,我们了解了在C语言中使用正则表达式去掉特殊字符的方法和注意事项。

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语言中,可以使用正则表达式相关的函数库来实现这些功能。

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语言中实现对文本的正则表达式匹配。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

正则表达式在linux下应用非常广泛,经常使用sed、awk、grep、vi、emacs等都支持正则表达式,处理最好的莫过于perl,perl把正则表达式内置到语言内,使用起来非常方便。

正则表达式的最大功用就是减轻程序员负担(程序员都很懒),简化处理字符串的复杂度,用C写一个split函数估计至少要15分钟,而这些东东都已经成为正则表达式默认支持的工具了。

ISO标准是不支持正则表达式的,这也导致很多程序员放弃C而转向perl、python的原因,不过POSIX是支持的,我在APUE读书笔记中提到过,就是regex.h:
#include<sys/types.h>
#include<regex.h>
int regcomp(regex_t*preg,const char*regex,int cflags);
int regexec(const regex_t*preg,const char*string,size_t nmatch, regmatch_t pmatch[],int eflags);
size_t regerror(int errcode,const regex_t*preg,char*errbuf,size_t errbuf_size);
void regfree(regex_t*preg);
正常的使用方式:编译正则表达式(regcomp)、匹配正则表达式(regexec)、释放正则表达式(regfree)
下面是一个例子:
这个是匹配Email的程序,按照上面的三步走就可以。

C语言中巧用正则表达式
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。

编译正则表达式
为了提高效率,在将一个字符串与正则表达式进行比较之前,首先要用regcomp()函数对它进行编译,将其转化为regex_t结构:
int regcomp(regex_t*preg,const char*regex,int cflags);
Param
参数regex是一个字符串,它代表将要被编译的正则表达式;
参数preg指向一个声明为regex_t的数据结构,用来保存编译结果;
参数cflags决定了正则表达式该如何被处理的细节。

Return
如果函数regcomp()执行成功,并且编译结果被正确填充到preg中后,函数将返回0,
任何其它的返回结果都代表有某种错误产生。

匹配正则表达式
一旦用regcomp()函数成功地编译了正则表达式,接下来就可以调用regexec()函数完成模式匹配:
int regexec(const regex_t*preg,
const char*string,
size_t nmatch,
regmatch_t pmatch[],
int eflags
);
typedef struct
{
regoff_t rm_so;
regoff_t rm_eo;
}regmatch_t;
Param
参数preg指向编译后的正则表达式,
参数string是将要进行匹配的字符串,
参数nmatch和pmatch则用于把匹配结果返回给调用程序,
参数eflags决定了匹配的细节。

ReMark
在调用函数regexec()进行模式匹配的过程中,可能在字符串string中会有多处与给定的正则表达式相匹配,参数pmatch就是用来保存这些匹配位置的,而参数nmatch则告诉函数regexec()最多可以把多少个匹配结果填充到pmatch数组中。

当regexec()函数成功返回时,从string+pmatch[0].rm_so到string+pmatch[0].rm_eo是第一个匹配的字符串,而从string+pmatch[1].rm_so到string+pmatch[1].rm_eo,则是第二个匹配的字符串,依此类推。

释放正则表达式
无论什么时候,当不再需要已经编译过的正则表达式时,都应该调用函数regfree()将其释放,以免产生内存泄漏。

void regfree(regex_t*preg);
函数regfree()不会返回任何结果,它仅接收一个指向regex_t数据类型的指针,这是之前调用regcomp()函数所得到的编译结果。

如果在程序中针对同一个regex_t结构调用了多次regcomp()函数,POSIX标准并没有规定是否每次都必须调用regfree()函数进行释放,但建议每次调用regcomp()函数对正则表达式进行编译后都调用一次regfree()函数,以尽早释放占用的存储空间。

报告错误信息
如果调用函数regcomp()或regexec()得到的是一个非0的返回值,则表明在对正则表达式的处理过程中出现了某种错误,此时可以通过调用函数regerror()得到详细的错误信息。

size_t regerror(int errcode,const regex_t*preg,char*errbuf,size_t errbuf_size);
Param
参数errcode是来自函数regcomp()或regexec()的错误代码,
参数preg是由函数regcomp()得到的编译结果,
其目的是把格式化消息所必须的上下文提供给regerror()函数。

参数errbuf_size指明的最大字节数,
应用正则表达式
最后给出一个具体的实例,介绍如何在C语言程序中处理正则表达式。

#include<stdio.h>
#include<sys/types.h>
#include<regex.h>
/*取子串的函数*/
static char*
substr(const char*str,unsigned start,unsigned end) {
unsigned n=end-start;
static char stbuf[256];
strncpy(stbuf,str+start,n);
stbuf[n]=0;return stbuf;
}
/*主程序*/
int
main(int argc,char**argv)
{
char*pattern;
int x,z,lno=0,cflags=0;
char ebuf[128],lbuf[256];
regex_t reg;
regmatch_t pm[10];
const size_t nmatch=10;
/*编译正则表达式*/
pattern=argv[1];
z=regcomp(?,pattern,cflags);
if(z!=0)
{
regerror(z,?,ebuf,sizeof(ebuf));
fprintf(stderr,"%s:pattern'%s'\n",ebuf,pattern); return1;
}
/*逐行处理输入的数据*/
while(fgets(lbuf,sizeof(lbuf),stdin))
{
++lno;
if((z=strlen(lbuf))>0&&lbuf[z-1]=='\n')
lbuf[z-1]=0;
/*对每一行应用正则表达式进行匹配*/
z=regexec(?,lbuf,nmatch,pm,0);
if(z==REG_NOMATCH)
continue;
else if(z!=0)
{
regerror(z,?,ebuf,sizeof(ebuf));
fprintf(stderr,"%s:regcom('%s')\n",ebuf,lbuf); return2;
}
/*输出处理结果*/
for(x=0;x<nmatch&&pm[x].rm_so!=-1;++x)
{
if(!x)
printf("%04d:%s\n",lno,lbuf);
printf("$%d='%s'\n",x,substr(lbuf,pm[x].rm_so,pm[x].rm_eo));
}
}
/*释放正则表达式*/
regfree(?);
return0;
}
上述程序负责从命令行获取正则表达式,然后将其运用于从标准输入得到的每行数据,并打印出匹配结果。

执行下面的命令可以编译并执行该程序:
#gcc regexp.c-o regexp
#./regexp'regex[a-z]*'<regexp.c
0003:#include<regex.h>$0='regex'
0027:regex_t reg;$0='regex'
0054:z=regexec(?,lbuf,nmatch,pm,0);$0='regexec'
小结
对那些需要进行复杂数据处理的程序来说,正则表达式无疑是一个非常有用的工具。

本文重点在于阐述如何在C语言中利用正则表达式来简化字符串处理,以便在数据处理方面能够获得与Perl语言类似的灵活性。

相关文档
最新文档