欢迎来到皮皮网网首页

【加载动画gif源码】【directx 源码】【birdfont源码】c 正则 源码_正则表达式源码

来源:zabbix源码包 时间:2024-11-25 04:05:24

1.以“c”“d”或“e”开头的正则源则表正则表达式?
2.在C/C++语言中使用正则表达式
3.正则表达式.*?

c  正则 源码_正则表达式源码

以“c”“d”或“e”开头的正则表达式?

       以 "c"、"d" 或 "e" 开头的码正正则表达式可以使用字符集合(character set)来实现,即使用方括号 [ ] 括起需要匹配的达式字符。具体地,源码该正则表达式可以写作:

       ^[cde]

       其中 ^ 表示匹配行首,正则源则表[ ] 内的码正加载动画gif源码 cde 表示匹配 c、d 或 e 中的达式任意一个字符。这个正则表达式可以匹配以下字符串:

       - "cat"

       - "dog"

       - "elephant"

       - "car"

       - "deer"

       但是源码不能匹配以下字符串:

       - "fat"(不以 c、d 或 e 开头)

       - "rat"(同上)

       - "mice"(同上)

在C/C++语言中使用正则表达式

       本文所有的正则源则表内容都来自网络,加上一些个人的码正理解,不保证正确性,达式欢迎批评指正

           说起正则表达式(Regular Expression),源码也许有的正则源则表directx 源码朋友天天都在使用,比如grep、码正vim、达式sed、awk,只是可能对这个名词不大熟悉。正则表达式一般简写为regex或者regexp,甚至是RE。关于正则表达式的介绍,有很多的文章,用搜索引擎查找就可以找到很不错的使用说明。但是在C/C++语言中如何去使用,相应的birdfont源码介绍比较缺乏。大多数C标准库自带regex,可以通过/usr/include/regex.h去看,或者man regex看使用说明。perl,php等语言更是提供了功能强大的正则表达式,最著名的C语言正则表达式库为PCRE(Perl Compatible Regular Expression)。本文主要对regex和pcre的使用做一点入门介绍。

           1、regex

           regex的使用非常简单,只要看一下示例代码1就能明白(示例代码是从“GNU C 规则表达式入门”这篇文章里摘取出来的,是否为原始出处就

           不得而知了)。

           CODE:#include stdio.h

           #include string.h

           #include regex.h

           #define SUBSLEN              /* 匹配子串的dbutility源码数量 */

           #define EBUFLEN          /* 错误消息buffer长度 */

           #define BUFLEN          /* 匹配到的字符串buffer长度 */

           int main()

           {

           size_t       len;

           regex_t       re;      /* 存储编译好的正则表达式,正则表达式在使用之前要经过编译 */

           regmatch_t    subs [SUBSLEN]; /* 存储匹配到的字符串位置 */

           char          matched [BUFLEN];     /* 存储匹配到的字符串 */

           char          errbuf [EBUFLEN]; /* 存储错误消息 */

           int          err, i;

           char          src    [] = " titleHello World/title "; /* 源字符串 */

           char          pattern [] = "title(.*)/title"; /* pattern字符串 */

           printf("String : %s/n", src);

           printf("Pattern: /"%s/"/n", pattern);

           /* 编译正则表达式 */

           err = regcomp(re, pattern, REG_EXTENDED);

           if (err) {

           len = regerror(err, re, errbuf, sizeof(errbuf));

           printf("error: regcomp: %s/n", errbuf);

           return 1;

           }

           printf("Total has subexpression: %d/n", re.re_nsub);

           /* 执行模式匹配 */

           err = regexec(re, src, (size_t) SUBSLEN, subs, 0);

           if (err == REG_NOMATCH) { /* 没有匹配成功 */

           printf("Sorry, no match .../n");

           regfree(re);

           return 0;

           } else if (err) {   /* 其它错误 */

           len = regerror(err, re, errbuf, sizeof(errbuf));

           printf("error: regexec: %s/n", errbuf);

           return 1;

           }

           /* 如果不是REG_NOMATCH并且没有其它错误,则模式匹配上 */

           printf("/nOK, has matched .../n/n");

           for (i = 0; i = re.re_nsub; i++) {

           len = subs[i].rm_eo - subs[i].rm_so;

           if (i == 0) {

           printf ("begin: %d, len = %d   ", subs[i].rm_so, len); /* 注释1 */

           } else {

           printf("subexpression %d begin: %d, len = %d   ", i, subs[i].rm_so, len);

           }

           memcpy (matched, src + subs[i].rm_so, len);

           matched[len] = '/0';

           printf("match: %s/n", matched);

           }

           regfree(re); /* 用完了别忘了释放 */

           return (0);

           }

           执行结果是

           CODE:String : titleHello World/title

           Pattern: "title(.*)/title"

           Total has subexpression: 1

           OK, has matched ...

           begin: %, len = 4   match: titleHello World/title

           subexpression 1 begin: , len =   match: Hello World

           从示例程序可以看出,使用之前先用regcomp()编译一下,然后调用regexec()进行实际匹配。如果只是看有没有匹配成功,掌握这2个函数的用法即可。有时候我们想要取得匹配后的子表达式,比如示例中想获得title是什么,需要用小括号 "( )"把子表达式括起来"title(.*)/title",表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的流转源码表达式所匹配到

           的字符串可以单独获取,示例程序就是我用来获取pile(pattern, 0, error, erroffset, NULL);

           if (re == NULL) {

           printf("PCRE compilation failed at offset %d: %s/n", erroffset, error);

           return 1;

           }

           rc = pcre_exec(re, NULL, src, strlen(src), 0, 0, ovector, OVECCOUNT);

           if (rc 0) {

           if (rc == PCRE_ERROR_NOMATCH) printf("Sorry, no match .../n");

           else printf("Matching error %d/n", rc);

           free(re);

           return 1;

           }

           printf("/nOK, has matched .../n/n");

           for (i = 0; i rc; i++) {

           char *substring_start = src + ovector[2*i];

           int substring_length = ovector[2*i+1] - ovector[2*i];

           printf("%2d: %.*s/n", i, substring_length, substring_start);

           }

           free(re);

           return 0;

           }

           执行结果是:

           CODE:String : titleHello World/title

           Pattern: "title(.*)/title"

           OK, has matched ...

           0: titleHello World/title

           1: Hello World

           比较这2个例子可以看出,在regex用的是regcomp()、regexec(),pcre则使用pcre_compile()、pcre_exec(),用法几乎完全一致。

           pcre_compile()有很多选项,详细说明参见plie(re,

           PCRE_DOTALL,....),表示'.'也匹配回车换行"/r/n"。

           3、pcre++

           pcre++(http://www.daemon.de/PCRE)对pcre做了c++封装,使用起来更加方便。

           CODE:/

*

           * g++ pcre2.cpp -I/usr/local/include -L/usr/local/lib -R/usr/local/lib -lpcre++ -lpcre

           */

           #include string

           #include iostream

           #include pcre++.h

           using namespace std;

           using namespace pcrepp;

           int main()

           {

           string src(" titleHello World/title ");

           string pattern("title(.*)/title");

           cout "String : " src endl;

           cout "Pattern : " pattern endl;

           Pcre reg(pattern, PCRE_DOTALL);

           if (reg.search(src) == true) { //

           cout "/nOK, has matched .../n/n";

           for(int pos = 0; pos reg.matches(); pos++) {

           cout pos ": " reg[pos] endl;

           }

           } else {

           cout "Sorry, no match .../n";

           return 1;

           }

           return 0;

           }

           执行结果是:

           CODE:String : titleHello World/title

           Pattern : title(.*)/title

           OK, has matched ...

           0: Hello World

           4、oniguruma

           还有一个正则表达式的库oniguruma(http://www.geocities.jp/kosako3/oniguruma/),对于东亚文字支持比较好,开始是用在ruby上,也可用于C++,是日本的开发人员编写的。大多数人都不会用到,也就不做介绍了。如果有疑问可以通过email来讨论它的用法。

           5、Regular Expression的内部实现

           关于Regular Expression的实现,用到了不少自动机理论(Automata Theory)的知识,有兴趣的可以找这方面的资料来看,这本书“

           Introduction to Automata Theory, Languages, and Computation”写的很好,编译原理的书也有这方面的内容。

正则表达式.*?

       表达式 .* 就是单个字符匹配任意次,即贪婪匹配。 表达式 .*? 是满足条件的情况只匹配一次,即最小匹配.

       举例介绍:

       如:<img src="test.jpg" width="px" height="px"/>

       懒惰模式正则:

       src=".*?"

       结果:src="test.jpg"

扩展资料

       正则表达式特殊字符及其含义:

       1、\cx    

       匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。    

       2、\f    

       匹配一个换页符。等价于 \x0c 和 \cL。    

       3、\n  

       匹配一个换行符。等价于 \ 和 \cJ。    

       4、\r    

       匹配一个回车符。等价于 \x0d 和 \cM。    

       5、\s    

       匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。    

       6、\S    

       匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。    

       7、\t    

       匹配一个制表符。等价于 \x 和 \cI。    

       8、\v    

       匹配一个垂直制表符。等价于 \x0b 和 \cK。    

       参考资料:

       百度百科——正则表达式