PCRE库函数介绍
2. pcre_compile2
函数原型:
pcre *pcre_compile2(const char *pattern, int options, int *errorcodeptr, const char **errptr, int *erroffset, const unsigned char *tableptr) 功能:将一个正则表达式编译成一个内部表示,在匹配多个 字符串时,可以加速匹配。其同pcre_compile功能一样只是 多一个参数errorcodeptr。 参数: pattern 正则表达式 options 为0,或者其他参数选项 errorcodeptr 存放出错码 errptr 出错消息 erroffset 出错位置
PCRE十分易用,同时功能也很强大,性能
超过了POSIX正则表达式库和一些经典的正 则表达式库 下面是网上比较准确的对比数据,可参考如 下网址: /refflavors.html
和Boost正则表达式库的比较显示[2],双方的
反向引用: 对指定分组已捕获的字符串进行引用,要求文本中当前位置开始的 字符串,必须和指定分组捕获到的字符串一致。表达式在匹配时, 表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下 来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符 串可以单独获取。 其实,"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束 后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可 以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串,"\2" 引用第 2对括号内匹配到的字符串……以此类推,如果一对括号内包含另 一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。
重复: 基实就是一种限定符,从字面上也可以看 出其意思了不多做解释。举几个例子就明 白了。 例如:0\d{2}-\d{8}匹配这样的字符串:以0 开头,然后是两个数字,然后是一个连字 号“-”,最后是8个数字(也就是中国的电 话号码。当然,这个例子只能匹配区号为 3位的情形)
表2.常用的限定符 说明 重复零次或更多次 重复一次或更多次 重复零次或一次 重复n次 重复n次或更多次 重复n到m次 代码/语法 * + ? {n} {n,} {n,m}
使用小括号的时候,还有很多特定用途的语法。 下面列出了最常用的一些:
表4.常用分组语法 分类 代码/语法 (exp) 捕获 (?<name>exp) (?:exp) (?=exp) 零宽断言 (?<=exp) (?!exp) (?<!exp) 注释 (?#comment) 说明 匹配exp,并捕获文本到自动命名的组里 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号 匹配exp前面的位置 匹配exp后面的位置 匹配后面跟的不是exp的位置 匹配前面不是exp的位置 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
PCRE:正则表达式在C语言中的实 现
主要讲两方面的内容
正则表达式语法
PCRE在C语言中的运用
首先看下面是几个正则表达:
^[1-9]*[1-9][0-9]*$ (\d{3}-|\d{4}-)?(\d{8}|\d{7})? /<(.*)>.*<\/>|<(.*) \/>/
^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$
7. pcre_dfa_exec
函数原型: int pcre_dfa_exec(const pcre *code, const pcre_extra *extra, const char *subject, int length, int startoffset, int options, int *ovector, int ovecsize, int *workspace, int wscount) 功能:使用编译好的模式进行匹配,采用的是一种非传统的方法DFA,只是对匹配串扫描 一次(与Perl不兼容)。 参数: code 编译好的模式 extra 指向一个pcre_extra结构体,可以为NULL subject 需要匹配的字符串 length 匹配的字符串长度(Byte) startoffset 匹配的开始位置 options 选项位 ovector 指向一个结果的整型数组 ovecsize 数组大小 workspace 一个工作区数组 wscount 数组大小
表1.常用的元字符 代码 . \w \s \d 说明 匹配除换行符以外的任意字符 匹配字母或数字或下划线或汉字 匹配任意的空白符 匹配数字
\b
^ $
匹配单词的开始或结束
匹配字符串的开始 匹配字符串的结束
字符转义: 如果你想查找元字符本身的话,比如你查找., 或者*,就出现了问题:你没办法指定它们,因 为它们会被解释成别的意思。这时你就得使 用\来取消这些字符的特殊意义。因此,你应 该使用\.和\*。当然,要查找\本身,你也得用 \\. 例如:deerchao\.net匹配, C:\\Windows匹配C:\Windows。
请看示例: \b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。这 个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个 的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后 是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配 的那个单词)(\1)。 你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使 用这样的语法:(?<Word>\w+)(或者把尖括号换成'也行:(?'Word'\w+)), 这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容, 你可以使用\k<Word>,所以上一个例子也可以写成这样: \b(?<Word>\w+)\b\s+\k<Word>\b。
反义: 用于查找不属于某个能简单定义的字符类的字 符。 例如:想查找除了数字以外,其它任意字符都行 的情况,这时需要用到反义 。 例子: \S+匹配不包含空白符的字符串。 <a[^>]+>匹配用尖括号括起来的以a开头的字符 串。
表3.常用的反义代码 代码/语法 \W \S \D \B [^x] [^aeiou] 说明 匹配任意不是字母,数字,下划线,汉字的字符 匹配任意不是空白符的字符 匹配任意非数字的字符 匹配不是单词开头或结束的位置 匹配除了x以外的任意字符 匹配除了aeiou这几个字母以外的任意字符
5.pcre_copy_named_substring
函数原型: int pcre_copy_named_substring(const pcre *code, const char *subject, int *ovector, int stringcount, const char *stringname, char *buffer, int buffersize) 功能:根据名字获取捕获的字串。 参数: code 成功匹配的模式 subject 匹配的串 ovector pcre_exec() 使用的偏移向量 stringcount pcre_exec()的返回值 stringname 捕获字串的名字 buffer 用来存储的缓冲区 buffersize 缓冲区大小
1. pcre_compile
函数原型:
pcre *pcre_compile(const char *pattern, int options, const char **errptr, int *erroffset, const unsigned char *tableptr) 功能:将一个正则表达式编译成一个内部表示,在匹配多个 字符串时,可以加速匹配。其同pcre_compile2功能一样只 是缺少一个参数errorcodeptr。 参数: pattern 正则表达式 options 为0,或者其他参数选项 errptr 出错消息 erroffset 出错位置
6. pcre_copy_substring
函数原型:
int pcre_copy_substring(const char *subject, int *ovector, int stringcount, int stringnumber, char *buffer, int buffersize) 功能:根据编号获取捕获的字串。 参数: code 成功匹配的模式 subject 匹配的串 ovector pcre_exec() 使用的偏移向量 stringcount pcre_exec()的返回值 stringnumber 捕获字串编号 buffer 用来存储的缓冲区 buffersize 缓冲区大小
断言: 用来声明一个应该为真的事实。正则表达式 中只有当断言为真时才会继续进行匹配。
2.PCRE在C语言中的运用
PCRE与其他正则表达式库的性能对比
PCRE提供的19个接口函数函数介绍及运用实例
PCRE与其他正则表达式库的性 能对比
元字符:就是指那些在正则表达式中具有特殊 意义的专用字符,可以用来规定其前导字符 (即位于元字符前面的字符)在目标对象中 的出现模式。 或者说,是一个或一组代替一 个或多个字符的字符。 例如:\b 代表着单词的开头或结尾,也就是单词的分界