c正则表达式
用c语言实现正则表达式
用c语言实现正则表达式
在C语言中,正则表达式通常使用POSIX标准库中的头文件进行操作。以下是一个简单的示例,说明如何使用C语言和POSIX正则表达式库来匹配字符串是否符合某个正则表达式。
```c
include <>
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;
}
```
C语言中的正则表达式应用
C语言中的正则表达式应用
在C语言中,正则表达式是一种非常强大的工具,可以用来匹配、查找和替换字符串。在C语言中,正则表达式的应用主要依赖于正则表达式库,比如PCRE
和Boost.Regex等。
正则表达式在C语言中的应用主要包括以下几个方面:
1. 匹配字符串:使用正则表达式可以对字符串进行匹配,判断字符串是否符合
特定的模式。比如可以使用正则表达式来检查一个字符串是否为合法的邮箱地址、IP地址或者电话号码等。
2. 查找字符串:正则表达式还可以用来查找字符串中符合某种模式的子串。比
如可以使用正则表达式在一个文本文件中查找所有的网址链接或者手机号码等。
3. 替换字符串:除了匹配和查找字符串,正则表达式还可以用来替换字符串中
的特定子串。比如可以使用正则表达式将一个文本文件中的所有日期格式替换成另一种日期格式。
在C语言中使用正则表达式通常需要引入相应的正则表达式库,然后利用库提供的函数进行操作。下面以PCRE库为例,演示如何在C语言中使用正则表达式:首先需要包含PCRE库的头文件:
```c
#include <pcre.h>
```
初始化PCRE库并编译正则表达式:
```c
const 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");
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);
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 个字符
%[^=] 读取字符串直到碰到 ’=’ 号, ’^’ 后⾯可以带更多字符 , 如:
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语言中常用的正则表达式函数库是POSIX标准的regex.h。这个库提供了一系列函数,包括编译正则表达式、匹配正则表达式、释放资源等。下面我们将介绍一些常用的函数及其用法。
需要包含regex.h头文件:
```c
#include
```
接下来,需要定义一个regex_t类型的变量来存储编译后的正则表达式:
```c
regex_t regex;
```
然后,使用regcomp函数编译正则表达式:
```c
int regcomp(regex_t *preg, const char *pattern, int cflags);
```
其中,preg为指向regex_t类型变量的指针,pattern为正则表达式的字符串,cflags为编译选项,可以指定不同的匹配方式。
编译成功后,可以使用regexec函数进行正则表达式的匹配:
```c
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
```
其中,preg为指向regex_t类型变量的指针,string为待匹配的字符串,nmatch为最多匹配的次数,pmatch为存储匹配结果的结构体数组,eflags为匹配选项。
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':匹配任意数字;
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标准库提供了一系列函数来处理正则表达式,包括编译正则表达式、执行匹配和释放资源等。常用的函数有:
c语言正则表达式
c语⾔正则表达式
标准的C和C++都不⽀持正则表达式,但有⼀些函数库可以辅助C/C++程序员完成这⼀功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发⾏版本都带有这个函数库。
C语⾔处理正则表达式常⽤的函数有regcomp()、regexec()、regfree()和regerror(),⼀般分为三个步骤,如下所⽰:
C语⾔中使⽤正则表达式⼀般分为三步:
1. 编译正则表达式 regcomp()
2. 匹配正则表达式 regexec()
3. 释放正则表达式 regfree()
下边是对三个函数的详细解释
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 匹配字母时忽略⼤⼩写。
c++正则表达式基础
C++的正则表达式库是标准库中的一部分,它提供了一种使用正则表达式进行字符串匹配和操作的方法。下面是一些C++正则表达式的基础知识:
1.正则表达式语法:正则表达式是一种用于描述字符串模式的语法。它可以用于匹配、
查找和替换字符串中的模式。在C++中,正则表达式使用斜杠(/)作为定界符,并在其中编写正则表达式模式。
2.正则表达式元字符:正则表达式中包含一些特殊的字符,称为元字符。它们用于描
述字符串中的模式。一些常见的元字符包括:
o.:匹配除换行符以外的任何单个字符。
o^:匹配字符串的开头。
o$:匹配字符串的结尾。
o*:匹配前面的字符或子模式零次或多次。
o+:匹配前面的字符或子模式一次或多次。
o?:匹配前面的字符或子模式零次或一次。
o{n}:匹配前面的字符或子模式恰好n次。
o{n,}:匹配前面的字符或子模式至少n次。
o{n,m}:匹配前面的字符或子模式至少n次且至多m次。
3.正则表达式类:C++中提供了几个用于处理正则表达式的类,包括std::regex、
std::sregex_token_iterator和std::smatch等。其中,std::regex类用于表示正则表达式,std::sregex_token_iterator类用于在字符串中查找匹配项,而std::smatch类用于存储匹配结果。
4.示例代码:下面是一个简单的C++代码示例,演示了如何使用正则表达式库进行字
符串匹配和操作:
cpp复制代码
#include(<iostream>(
#include(<regex>(
c正则表达式
c正则表达式
摘要:
1.正则表达式的概念与作用
2.正则表达式的基本语法
3.正则表达式的应用实例
正文:
一、正则表达式的概念与作用
正则表达式(Regular Expression,简称regex)是一种用于处理字符串的强大工具,它可以用来检查字符串是否符合某种模式、提取字符串中的特定信息等。正则表达式广泛应用于计算机科学和编程领域,例如文本编辑器、搜索引擎、数据验证等场景。
二、正则表达式的基本语法
正则表达式的基本语法包括以下几种元素:
1.字面字符:例如a、b、c 等。
2.元字符:例如.、*、+、?等,它们具有特殊的含义。
-.:匹配任意字符(除了换行符)。
- *:表示零次或多次匹配前面的字符或表达式。
- +:表示一次或多次匹配前面的字符或表达式。
-?:表示零次或一次匹配前面的字符或表达式。
- {n}:表示n 次匹配前面的字符或表达式。
- {n,}:表示n 次或多次匹配前面的字符或表达式。
- {n,m}:表示n 到m 次匹配前面的字符或表达式。
3.字符类:用于匹配某一类字符,例如[a-z] 表示匹配小写字母,[0-9] 表示匹配数字等。
4.锚点:例如^、$、d等,它们用于指定匹配的位置。
5.分组和捕获:用于将正则表达式的一部分组合在一起,以便进行特定操作。
三、正则表达式的应用实例
以下是正则表达式在实际应用中的一些实例:
1.验证邮箱地址:例如^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$。
2.提取网页中的链接:例如href="(//[^s]+)")。
判断c函数的正则表达式
判断c函数的正则表达式
C函数的正则表达式是一种用于匹配和判断C语言函数的模式。在C 语言中,函数是由函数名、参数列表和函数体组成的代码块,正则表达式可以帮助我们快速准确地识别和分析函数的结构和特征。
正则表达式是一种描述字符模式的工具,它使用特定的语法和符号来表示字符的组合和规则。在C函数的正则表达式中,我们可以使用一些特定的符号和规则来匹配函数的各个部分。
我们需要匹配函数名。函数名由字母、数字和下划线组成,并且以字母或下划线开头。所以我们可以使用正则表达式`^[a-zA-Z_]\w*$`来匹配函数名。
接下来,我们需要匹配参数列表。参数列表由多个参数组成,每个参数由参数类型和参数名组成。参数类型可以是基本数据类型,也可以是指针或数组类型。参数名由字母、数字和下划线组成,并且以字母或下划线开头。所以我们可以使用正则表达式`(\w+\s*\*?\s*\w+\s*,\s*)*\w+\s*\*?\s*\w+`来匹配参数列表。我们需要匹配函数体。函数体由一对花括号包围的代码块组成。由于函数体中可能包含任意字符和符号,所以我们可以使用正则表达式`{[\s\S]*}`来匹配函数体。
C函数的正则表达式可以表示为`^[a-zA-Z_]\w*\s+\w+\s*\(\s*(\w+\s*\*?\s*\w+\s*,\s*)*\w+\s*\*?\s*\w
+\s*\)\s*{[\s\S]*}`。
通过使用这个正则表达式,我们可以快速判断一段代码中是否包含符合C函数结构的函数定义。例如,对于下面的代码段:
```c
int add(int a, int b) {
c语言正则表达式规则
c语言正则表达式规则
摘要:
1.引言
2.C 语言正则表达式的概念
3.C 语言正则表达式的语法
4.C 语言正则表达式的应用
5.总结
正文:
【引言】
正则表达式(Regular Expression),又称规则表达式,是一种用于匹配字符串模式的文本处理工具。C 语言作为一门广泛应用于系统编程和嵌入式开发的编程语言,也提供了对正则表达式的支持。本文将详细介绍C 语言正则表达式的相关知识。
【C 语言正则表达式的概念】
C 语言中的正则表达式主要通过`regex`库来实现。`regex`库提供了一系列函数,用于编译、匹配和替换正则表达式。正则表达式通常由一系列字符和元字符组成,用于描述要匹配的字符串模式。
【C 语言正则表达式的语法】
C 语言正则表达式的语法与Perl、Python 等其他编程语言中的正则表达式语法相似。主要包含以下几种类型的字符和元字符:
1.字面字符:例如`a`、`b`等。
2.元字符:例如`.`(匹配任意字符)、`*`(匹配零个或多个前面的字符)、`+`(匹配一个或多个前面的字符)等。
3.字符类:用方括号表示,例如`[a-z]`(匹配小写字母)、`[0-9]`(匹配数字)等。
4.锚点:例如`^`(表示字符串开头)、`$`(表示字符串结尾)等。
5.分组和捕获:使用圆括号表示,例如`(abc)`(表示匹配连续的`abc`字符)。
【C 语言正则表达式的应用】
C 语言正则表达式在实际应用中主要用于文本处理和数据分析等领域。以下是一些常见的应用场景:
1.字符串查找与替换:使用`regex_search`和`regex_replace`函数,可以在字符串中查找符合特定模式的子串,并将其替换为指定的字符串。
c语言正则表达式规则
c语言正则表达式规则
摘要:
一、正则表达式的基本概念
1.正则表达式的定义
2.正则表达式的作用
二、C语言中的正则表达式
1.C语言正则表达式的基本语法
2.C语言正则表达式的常见函数
三、正则表达式的应用场景
1.字符串匹配
2.数据验证
四、正则表达式的高级特性
1.贪婪与懒惰匹配
2.零宽断言
3.反向引用
五、正则表达式的使用注意事项
1.字符集与量词
2.特殊字符与元字符
正文:
一、正则表达式的基本概念
正则表达式(Regular Expression),又称正规表达式、规则表达式,是一
种用于描述字符或字符序列的抽象表达式。它通过一定的语法规则来表示字符串的匹配模式,常用于文本搜索与匹配、数据验证等领域。
1.正则表达式的定义
正则表达式是一种用来描述字符或字符序列的抽象表达式,通常由一系列字符、元字符和量词组成。它用于表示一个字符串的模式,可以用来检查一个字符串是否符合某种规则,或者将符合规则的字符串提取出来。
2.正则表达式的作用
正则表达式的主要作用是用于匹配和查找字符串。它可以帮助程序员快速地检查字符串是否符合某种特定的模式,或者从大量的文本数据中提取出符合特定规则的字符串。正则表达式在许多编程语言中都有应用,如C语言、Java、Python等。
二、C语言中的正则表达式
C语言中,正则表达式的实现主要依赖于库函数。常用的库函数包括
`strlen()`、`strcmp()`、`strstr()`等。此外,还有一些第三方库,如PCRE (Perl Compatible Regular Expressions),提供了更强大的正则表达式支持。
c语言regex用法
c语言regex用法
摘要:
1.C 语言正则表达式简介
2.C 语言中的regex 函数库
3.使用regex 函数库进行正则表达式操作的步骤
4.C 语言regex 示例
正文:
C 语言正则表达式是一种非常强大的文本处理工具,它可以让你在C 语言程序中进行复杂的文本匹配和替换操作。C 语言中的正则表达式函数库是regex.h,你需要包含这个头文件才能在你的程序中使用正则表达式。
使用regex 函数库进行正则表达式操作的步骤一般包括以下几个步骤:
1.包含头文件<regex.h>
2.声明regex_t 变量
3.初始化regex_t 变量
4.使用regexec 函数进行匹配操作
5.使用regfree 函数释放资源
下面是一个简单的C 语言regex 示例,它演示了如何使用regex 函数库进行文本匹配和替换操作:
```c
#include <stdio.h>
#include <regex.h>
int main() {
char text[] = "Hello, world!";
regex_t regex;
int ret;
// 初始化regex_t 变量
ret = regex_compile(text, ®ex, NULL);
if (ret!= REG_OK) {
printf("Error compiling regex: %s ", regex_error(®ex));
return 1;
}
// 使用regexec 函数进行匹配操作
ret = regex_match(text, ®ex, "o", 1);
C语言正则表达式
C语⾔正则表达式
#include <>
#include <>
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);
Description
POSIX regex compiling
regcomp() is used to compile a regular expression into a form that is suitable for subsequent regexec() searches.
regcomp() is supplied with preg, a pointer to a pattern buffer storage area; regex, a pointer to the null-terminated string and cflags, flags used to determine the type of compilation.
All regular expression searching must be done via a compiled pattern buffer, thus regexec() must always be supplied with the address of aregcomp() initialized pattern buffer. cflags may be the bitwise-or of one or more of the following:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中巧用正则表达式
如果用户熟悉Linux下的sed、awk、grep或vi,那么对正则表达式这一概念肯定不会陌生。由于它可以极大地简化处理字符串时的复杂度,因此现在已经在许多Linux实用工具中得到了应用。千万不要以为正则表达式只是Perl、Python、Bash等脚本语言的专利,作为C语言程序员,用户同样可以在自己的程序中运用正则表达式。
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。
编译正则表达式
为了提高效率,在将一个字符串与正则表达式进行比较之前,首先要用regcomp()函数对它进行编译,将其转化为regex_t结构:
参数regex是一个字符串,它代表将要被编译的正则表达式;参数preg指向一个声明为regex_t 的数据结构,用来保存编译结果;参数cflags决定了正则表达式该如何被处理的细节。
cflags 有如下4个值或者是它们或运算(|)后的值:
REG_EXTENDED 以功能更加强大的扩展规则表达式的方式进行匹配。
REG_ICASE 匹配字母时忽略大小写。
REG_NOSUB 不用存储匹配后的结果。
REG_NEWLINE 识别换行符,这样'$'就可以从行尾开始匹配,'^'就可以从行的开头开始匹配。
如果函数regcomp()执行成功,并且编译结果被正确填充到preg中后,函数将返回0,任何其它的返回结果都代表有某种错误产生。
匹配正则表达式
一旦用regcomp()函数成功地编译了正则表达式,接下来就可以调用regexec()函数完成模式匹配:
参数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()将其释放,以免产生内存泄漏。
函数regfree()不会返回任何结果,它仅接收一个指向regex_t数据类型的指针,这是之前调用regcomp()函数所得到的编译结果。
如果在程序中针对同一个regex_t结构调用了多次regcomp()函数,POSIX标准并没有规定是否每次都必须调用regfree()函数进行释放,但建议每次调用regcomp()函数对正则表达式进行编译后都调用一次regfree()函数,以尽早释放占用的存储空间。
报告错误信息
如果调用函数regcomp()或regexec()得到的是一个非0的返回值,则表明在对正则表达式的处理过程中出现了某种错误,此时可以通过调用函数regerror()得到详细的错误信息。
参数errcode是来自函数regcomp()或regexec()的错误代码,而参数preg则是由函数regcomp()得到的编译结果,其目的是把格式化消息所必须的上下文提供给regerror()函数。在执行函数regerror()时,将按照参数errbuf_size指明的最大字节数,在errbuf缓冲区中填入格式化后的错误信息,同时返回错误信息的长度。
应用正则表达式
最后给出一个具体的实例,介绍如何在C语言程序中处理正则表达式。
上述程序负责从命令行获取正则表达式,然后将其运用于从标准输入得到的每行数据,并打印出匹配结果。执行下面的命令可以编译并执行该程序:
小结
对那些需要进行复杂数据处理的程序来说,正则表达式无疑是一个非常有用的工具。本文重点在于阐述如何在C语言中利用正则表达式来简化字符串处理,以便在数据处理方面能够获得与Perl 语言类似的灵活性。
正则表达式