C语言有正则表达式吗

作者&投稿:化倪 (若有异议请与网页底部的电邮联系)
C语言怎么用正则表达式~

如何在C语言中巧用正则表达式

















看到大家讨论这方面的东西,作点贡献聊表各位高手对这个版快的无私奉献 :oops:

如果用户熟悉Linux下的sed、awk、grep或vi,那么对正则表达式这一概念肯定不会陌生。由于它可以极大地简化处理字符串时的复杂
度,因此现在已经在许多Linux实用工具中得到了应用。千万不要以为正则表达式只是Perl、Python、Bash等脚本语言的专利,作为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);



参数regex是一个字符串,它代表将要被编译的正则表达式;参数preg指向一个声明为regex_t的数据结构,用来保存编译结果;参数cflags决定了正则表达式该如何被处理的细节。

如果函数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;



参数preg指向编译后的正则表达式,参数string是将要进行匹配的字符串,而参数nmatch和pmatch则用于把匹配结果返回给调用程序,最后一个参数eflags决定了匹配的细节。

在调用函数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);



参数errcode是来自函数regcomp()或regexec()的错误代码,而参数preg则是由函数regcomp()得到的编译结果,
其目的是把格式化消息所必须的上下文提供给regerror()函数。在执行函数regerror()时,将按照参数errbuf_size指明的最大字
节数,在errbuf缓冲区中填入格式化后的错误信息,同时返回错误信息的长度。

应用正则表达式

最后给出一个具体的实例,介绍如何在C语言程序中处理正则表达式。

#include ;
#include ;
#include ;

/* 取子串的函数 */
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'
", ebuf, pattern);
return 1;
}
/* 逐行处理输入的数据 */
while(fgets(lbuf, sizeof(lbuf), stdin)) {
++lno;
if ((z = strlen(lbuf)) >; 0 && lbuf[z-1] == '
')
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')
", ebuf, lbuf);
return 2;
}
/* 输出处理结果 */
for (x = 0; x < nmatch && pm[x].rm_so != -1; ++ x) {
if (!x) printf("%04d: %s
", lno, lbuf);
printf(" $%d='%s'
", x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo));
}
}
/* 释放正则表达式 */
regfree(®);
return 0;
}



上述程序负责从命令行获取正则表达式,然后将其运用于从标准输入得到的每行数据,并打印出匹配结果。执行下面的命令可以编译并执行该程序:

# gcc regexp.c -o regexp
# ./regexp 'regex[a-z]*' < regexp.c
0003: #include ;
$0='regex'
0027: regex_t reg;
$0='regex'
0054: z = regexec(®, lbuf, nmatch, pm, 0);
$0='regexec'



小结

对那些需要进行复杂数据处理的程序来说,正则表达式无疑是一个非常有用的工具。本文重点在于阐述如何在C语言中利用正则表达式来简化字符串处理,以便在数据处理方面能够获得与Perl语言类似的灵活性。

并不一定,像VB6和之前的版本就不支持,在VBS中通过RegExp对象提供支持,而且各语言对正则支持情况也有差别.

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


请问什么是程序设计语言中的正则表达式和BNF表示法?
等)组成。简单地说,一个正则表达式就是你需要匹配的字符串。例如,正则表达式“A*B”匹配字符串“ACCCB”但是不匹配“ACCCC”。什么是巴科斯范式?巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言...

C#中的正则表达式和js中的是否一样?
正则表达式只是一个系统的概念,然后具体语言再对其实现。其实两者是不同的。但是由于使用者的习惯,大部分的时间是相同的。在js中正则表达式是一个类型。可以直接使用var s = \/pattern\/;这样的形式实现。所以说在js只直接是一种类型的。象用其他诸如字符串等类型一样使用他,只不过定界符不同。而在C#...

正则表达式所表示的语言
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。例如:runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。runoo*b,可以...

正则表达式中的\\{}\\{}\\{}是什么意思
\/\\{\\{(.+?)\\}\\}\/g 最前面的“\/”与最后面的“\/”是分隔符,表示正则表达式的开始与结束。最后的“g”标志则表示正则表达式使用的global(全局)的状态。使用 global 标志表明在被查找的字符串中搜索操作将查找所有符合的项,而不仅仅是第一个。这也被称为全局匹配。【相关的标志还有i(...

正则表达式里^[1-9]表示什么?
^[1-9]表示以1到9的某位数字开头。\\d*表示0-9的任意一位或者多位或者一位。表示以什么结束。在正则表达式中,用\\d表示一位数字。如果再其他语言中使用过正则表达式,那你立刻就能发现Java对反斜杠\\的不同处理。在其他语言中,\\\\表示:我想要在正则表达式中插入一个普通的反斜杠,不给他任何特殊...

正则表达式 "^+$"是什么意思
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成"regex",单数有regexp、regex,复数有regexps、regexes、regexen。正则表达式由一些普通字符和一些元字符...

R语言中的正则表达式
p匹配的是它自己,这就是原义表达式。本来只想匹配 . ,但是在这里这个点代表了所有字符,于是返回了1 2 3。这个. 就是一个转义表达式。分别提取含7-9的数字或3-4的数字的字符串 ^XX就是以XX开头的意思 当^放在方括号内是取非的意思 2{2,3}是寻找2倍重复了2到3次的意思 2{2,}是寻找2...

请问易语言的正则表达式取文本中间文字?
按照你的要求编写的程序如下(见图)

易语言中怎么用正则表达式
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。易语言中实现正则表达式...

有穷自动机接受的语言是正则语言
形式语言理论中最简单的语言类,是上下文无关语言类的一个真子类,在乔姆斯基语言分层中处于最低层。又称3型语言。正则语言有两种描述方法文法描述;正则表达式与接受器。正则语言已应用于计算机程序语言编译的词法分析、开关电路设计等方面。正则表达式与接受器正则语言是正则集,可以用称为正则表达式的简单...

孟州市15584863210: 如何在C语言中使用正则表达式 -
虿飘凯亭: 看到大家讨论这方面的东西,作点贡献聊表各位高手对这个版快的无私奉献 :oops: 如果用户熟悉Linux下的sed、awk、grep或vi,那么对正则表达式这一概念肯定不会陌生.由于它可以极大地简化处理字符串时的复杂 度,因此现在已经在许...

孟州市15584863210: C语言正则表达式 -
虿飘凯亭: 现在很多种语言都支持正则表达式,据说有个老外的书不错,精通正则表达式,哎,可惜,我们这小地方买本书比较难,C语言当然支持,许多主流语言都支持,正则表达式可以很大的提升效率,一段小代码就能实现长篇大论的程序,很精彩

孟州市15584863210: 编译原理:c语言标识符的正则表达式 -
虿飘凯亭: 是缺了.这个只能匹配字母开头、字母数字组成的标示符LZ可以自己加上,加在letter里

孟州市15584863210: C/C++支持正则表达式吗? -
虿飘凯亭: C++语言特性上不支持.目前标准库中也没有直接的支持.需要另外配置支持正则表达式的库.常用的是boost.regex库,具体资料很多,可以直接搜索.另外还有ATL CAtlRegExp、GRETA等.

孟州市15584863210: 请问一下c语言中能不能用sscanf来区分中文和英文 -
虿飘凯亭: 可以的.有个专业的东西叫“正则表达式”,C语言里也可以用类似的东西.你可以到网上搜下“sscanf高级用法“,有详细的讲解.我在这里只给你举个例子.#include int main(void) { char* pstr = "Hello你好123"; char strEn[20]; char strCn[20];sscanf(pstr, "%[a-zA-Z]%[^a-zA-Z0-9]", strEn, strCn); printf("%s %s\n", strEn, strCn); return 0; }

孟州市15584863210: 关于c语言中的正则表达式(regex) -
虿飘凯亭: 会正则 不会C语言

孟州市15584863210: C++中正则表达式怎么用 -
虿飘凯亭: 正则表达式(regular expression)是计算机科学中的一个概念,又称规则表达式,通常简写为regex、regexp、RE、regexps、regexes、regexen.正则表达式是一种文本模式.正则表达式是强大、便捷、高效的文本处理工具.正则表达式本身...

孟州市15584863210: 正则表达式可以用在c语言和vb中吗? -
虿飘凯亭: c语言默认情况下不支持正则表达式 vb可以 Function RegExpTest(patrn, strng) Dim regEx, Match, Matches ' 建立变量. Set regEx = New RegExp ' 建立正则表达式. regEx.Pattern = patrn ' 设置模式. regEx.IgnoreCase = True ' 设置是否区分字符...

孟州市15584863210: c语言中scanf 和 input有什么区别?求详细解释 -
虿飘凯亭: input 是面向对象的东西,跟正则表达式有关,正统的解释是“返回执行正则表达式搜索所针对的字符 这不是c语言的东西,所以跟scanf作对比是没意义的. scanf是格式输入函数

孟州市15584863210: c语言用指针处理字符串快还是用正则表达式快呢? -
虿飘凯亭: 这个要看CPU的汇编指令集,和C的编译器水平.一般来说指针比数组快,主要是因为汇编里面有指针自加的单周期指令.而完成一个数组的定位,需要一个偏移地址加基地址,然后再取该地址的值,这是两条指令.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网