vc 可用的正则表达式库

gnuregex,PCRE,greta,boost,CAtlReg

其中 CAtlReg 和greta 是微软的,不过 greta 据说已经多年不维护,不能在最新的编译器中编译.

--------------------------------------------------

不过我看 PCRE 也是 2007 年的呀. http://gnuwin32.sourceforge.net/packages/pcre.htm

哦,应该从 http://www.pcre.org/ 进去,那个确实是版本未最新的.

据说 "pcre就是公认最牛的C语言的正则表达式库,Python、Perl等语言都是用它。" 不知道 php 用的是什么库.

--------------------------------------------------

ATL正则表达式库使用

作者:firingme

转载:www.csdn.net

ATL中,由于ATL Server的需要,需要对Client发送过来的地址、命令等复杂文字字段信息解码,而正则表达式是公认的最强大的文字解析工具,所以,ATL提供了一些用于正则表达式的库方便了我们的工作。

1、 CATLRegExp类

声明:

template <class CharTraits=CAtlRECharTraits>
class CAtlRegExp; 

初始化:

与微软的GRETA类库(微软研究院推出的另一个正则表达式类库)不同,CATLRegExp并没 有在构造函数中提供初始化匹配字符串的方法,而是让使用者通过调用它的Parse()方法, 使用正则表达式字符串作为参数,就可以构造出一个我们所需要的用于匹配的类,例如我们 需要匹配一种时间格式,可以是h:mm、也可以是hh:mm,那么我们可以这样构造我们的CAtlRegExp类:

CAtlRegExp <> re;
re.Parse( "{[0-9]?[0-9]}:{[0-9][0-9]}" );

ATL的正则表达式语法和Perl的正则表达式语法大同小异,不过有一个值得注意的地方就 是ATL中用大括号({ })表示其匹配字符串中的Group,我们上面的表达式中,就声明了2 个Group,一个是[0-9]?[0-9],另一个是[0-9][0-9]。

匹配:
调用CATLRegExp的Match()方法,就可以用该类来进行匹配了,Match方法的原型如下:

BOOL Match(const RECHAR *szIn, CAtlREMatchContext<CharTraits> *pContext, const RECHAR **ppszEnd=NULL)

参数的含义很明显,不过需要注意到第一个参数的型别是:const RECHAR * szIN,是一个 const指针,这表明我们可以方便得使用std::string类的c_str()方法给其传递参数。

Match的结果通过第二个参数pContext所指向的CAtlREMatchContext<>类来返回,Match 的结果及其相关信息都被存放在CAtlREMatchContext类中,我们只要访问CAtlREMatchContext的方法和成员就可以得到匹配 的结果。

2、 CAtlREMatchContext类

声明:

template <class CharTraits=CAtlRECharTraits>
class CAtlREMatchContext

使用:

CAtlREMatchContext通过m_uNumGroups成员以及GetMatch()方法向调用者提供匹配的结果信息。m_uNumGroups代表匹配上的Group有多少组,GetMatch()则根据传递给它的Group
的Index值,返回匹配上的字符串的pStart和pEnd指针,调用者有了这两个指针,自然可以很方便的得到匹配结果。

3、 一个小示例

下面这个例子来源于MSDN,演示了CATLRegExp和CAtlREMatchContext类的典型使用方法:

#include "stdafx.h"
#include <atlrx.h>int main(int argc, char* argv[])
{CAtlRegExp<> reUrl;// five match groups: scheme, authority, path, query, fragmentREParseError status = reUrl.Parse("({[^:/?#]+}:)?(//{[^/?#]*})?{[^?#]*}(?{[^#]*})?(#{.*})?" );if (REPARSE_ERROR_OK != status){// Unexpected error.return 0;}CAtlREMatchContext<> mcUrl;if (!reUrl.Match( "http://search.microsoft.com/us/Search.asp?qu=atl&boolean=ALL#results",&mcUrl)){// Unexpected error.return 0;}for (UINT nGroupIndex = 0; nGroupIndex < mcUrl.m_uNumGroups;++nGroupIndex){const CAtlREMatchContext<>::RECHAR* szStart = 0;const CAtlREMatchContext<>::RECHAR* szEnd = 0;mcUrl.GetMatch(nGroupIndex, &szStart, &szEnd);ptrdiff_t nLength = szEnd - szStart;printf("%d: \"%.*s\"\n", nGroupIndex, nLength, szStart);}
}

Output

0: "http"
1: "search.microsoft.com"
2: "/us/Search.asp"
3: "qu=atl&boolean=ALL"
4: "results"

例子中所用的正则表达式为:

({[^:/?#]+}:)?(//{[^/?#]*})?{[^?#]*}(?{[^#]*})?(#{.*})?

以()为分界标志,共分成5组,第一组是{[^:/?#]+}:,^是“非”后面成员的意思,那么也就是说第一组从开头开始,一直到:、/、?、#其中任何一个结束。联系后面的待匹配字符串就可以得出所匹配的结果是http。

4、 自定义匹配字符串的缩写形式

为了方便,ATL已经帮我们定义了一些经常用到的正则表达式的简略形式。例如:\d代表([0-9])、\n代表(\r|(\r? \n))等。这些缩写形式都体现在CAtlRECharTraitsA/CAtlRECharTraitsW等类中,把这些类作为模板参数传递给 CATLRegExp和 CAtlREMatchContext,我们就可以定义自己的匹配字符串缩写了。

class CAtlRECharTraitsA
{static const RECHARTYPE** GetAbbrevs(){static const RECHARTYPE *s_szAbbrevs[] = {"a([a-zA-Z0-9])",   // alpha numeric"b([ \\t])",        // white space (blank)"c([a-zA-Z])",  // alpha"d([0-9])",     // digit"h([0-9a-fA-F])",   // hex digit"n(\r|(\r?\n))",    // newline"q(\"[^\"]*\")|(\''''[^\'''']*\'''')",   // quoted string"w([a-zA-Z]+)", // simple word"z([0-9]+)",        // integerNULL};return s_szAbbrevs;}
};

以上是atlrx.h摘录下来的代码,可以很清楚地看到ATL是通过一个GetAbbrevs()函数 来定义字符串缩写的。要定义新的缩写形式,我们只需要这样:

class   MyRegTraits : public ATL::CAtlRECharTraitsA
{
public:static const RECHARTYPE** GetAbbrevs(){static const RECHARTYPE *s_szAbbrevs[] = {"a([a-zA-Z0-9])",   // alpha numeric"b([ \\t])",        // white space (blank)"c([a-zA-Z])",  // alpha"d([0-9])",     // digit"h([0-9a-fA-F])",   // hex digit"n(\r|(\r?\n))",    // newline"q(\"[^\"]*\")|(\''''[^\'''']*\'''')",   // quoted string"w([a-zA-Z]+)", // simple word"z([0-9]+)",        // integer"e([0-8]+)",        //自己添加NULL};return s_szAbbrevs;}};

让我们自己定义的Trait类继承自CAtlRECharTraitsA,然后改写GetAbbrevs()函数,增加 一些需要的简写就可以被使用了。下面的代码示例了使用了我们自己的类中定义的“\e”简 略表达:

int main ( )
{ATL::CAtlRegExp < MyRegTraits > re ;re.Parse( "\\e+" ); ATL::CAtlREMatchContext < MyRegTraits > mc ;BOOL res1 = re.Match( "678", &mc );  // returns TRUE: successful matchres1 = re.Match ( "999" , &mc ) ;    //  returns FALSE:match fail
}

只要在构造ATL::CAtlRegExp和 ATL::CAtlREMatchContext类时,传递过去我们的 MyRegTraits类作为Traits的参数,就可以直接使用自己定义的简略符号了。

5、 结尾

虽然现在C++的社区里已经拥有了Boost::regex,GRETA等非常著名的正则表达式库,可是 作为VC++自带的模板库,ATL中的正则表达式库仍然给我们的工作提供了极大的便利。由于 ATL是微软官方发布的Library,所以它拥有良好的文档说明、严格的测试以及微软官方的 技术支持。另外在用ATL开发COM组件的时候,更可以方便地利用正则库的巨大威力。

由于本人学识所限,文章内容错在所难免,如有批评指正之词,请mail :firingme@sina.com

posted on 2012-03-19 14:19 clq 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/-clq/archive/2012/03/19/2406036.html

vc 可用的正则表达式库相关推荐

  1. 嵌入式java基准测试_Java正则表达式库基准测试– 2015年

    嵌入式java基准测试 在尝试使Java在计算机语言基准游戏的regexdna挑战中排名第一时,我正在研究Java正则表达式库的性能. 我可以找到的最新网站是2010年的tusker.org .因此, ...

  2. Java正则表达式库基准测试– 2015年

    在尝试使Java在计算机语言基准测试游戏的regexdna挑战中排名第一时,我正在研究Java正则表达式库的性能. 我可以找到的最新网站是2010年的tusker.org .因此,我决定使用Java ...

  3. Py之re:re正则表达式库的简介、常用函数、经典案例之详细攻略

    Py之re:re正则表达式库的简介.常用函数.经典案例之详细攻略 目录 re正则表达式库的简介 1.正则表达式元字符表集合--正则表达式的pattern re正则表达式库的常用函数 1.re.comp ...

  4. boost::regex模块实现config_info 来打印正则表达式库配置信息的测试程序

    boost::regex模块实现config_info 来打印正则表达式库配置信息的测试程序 实现功能 C++实现代码 实现功能 boost::regex模块实现config_info 来打印正则表达 ...

  5. 【.NET正则表达式库】v1.0上线

    在经历了近一年的构思.谋划.开发后,.NET正则表达式库(regex-lib.net)终于和各位网友见面了.欢迎大家访问:http://regex-lib.net/. 创意 坦率地说,.NET正则表达 ...

  6. vs编译c语言停止工作运行库mt,vc++编译时运行库选择(/MT/MTd/MD/MDd)

    vc++编译时运行库选择(/MT/MTd/MD/MDd) vc++编译时运行库选择(/MT./MTd./MD./MDd) 在vs中,项目属性 ->C/C++ ->代码生成 ->运行库 ...

  7. 深入浅出C/C++中的正则表达式库(二)——Boost.Regex

    写在前面:本文是<深入浅出C/C++中的正则表达式库>系列的第二篇,如果对本文感兴趣,相信你也会对<深入浅出C/C++中的正则表达式库--GNU Regex Library>感 ...

  8. Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答

    Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答 Boost正则表达式库regex常用search和match示例 发表回复 Boost ...

  9. 深入浅出C/C++中的正则表达式库(一)--GNU Regex Library

    正则表达式(Regular Expressions),又被称为regex或regexp,是一种十分简便.灵活的文本处理工具.它可以用来精确地找出某文本中匹配某种指定规则的内 容.在linux下,gre ...

最新文章

  1. 字典推导式_聊一聊:python的各种推导式(列表推导式、字典推导式、集合推导式)...
  2. 一文搞清楚,QPS、TPS、并发用户数、吞吐量
  3. c语言怎么解析midi文件,c – 无法读取midi文件? [扩展规格?]
  4. 5加载stm32 keil_「keil」嵌入式STM32开发环境之Keil5的安装(附资源) - 金橙教程网
  5. linux怎么切换为oracle用户权限,linux肿么给oracle中用户权限
  6. php mysql 失败_在php中插入失败的数据mysql
  7. 广播地址的作用_跟百哥学网络16:ARP地址解析协议分析
  8. java自动类型提升_Java中的基本数据类型转换(自动、强制、提升)
  9. 【java笔记】of方法 JDK9对集合添加方法的优化
  10. linux应用--yum
  11. [C/C++] ccpuid:CPUID信息模块 V1.02版,支持Mac OS X,支持纯C,增加CPUF常数
  12. Docker从理论到实践(二)------配置Docker镜像源加速器(部分使用效果已不太理想)
  13. 澳大利亚:令人钦羡的高福利国家 - 老牛的日志 - 网易博客
  14. CRNN——卷积循环神经网络结构
  15. Introductory Combinatorics 5th Solutions Chapter1 summary
  16. 密码学技术背后的计算困难性理论
  17. MySQL Audit 审计
  18. 计算机总线拓扑和环形拓扑,网络拓扑结构总线型环形星型,各自的优缺点是什么..._网络编辑_帮考网...
  19. 简单使用Search()函数
  20. 设备远程监控物联网平台

热门文章

  1. Unity3D基础24:LineRenderer特效
  2. 牛客练习赛23: D. 托米的咒语(暴力)
  3. HDU 6134 2017 多校训练:Battlestation Operational(莫比乌斯反演+积性函数)
  4. python之读入数据
  5. python自定义包的发布与安装
  6. centos7(linux)使用心得
  7. python机器学习库sklearn——朴素贝叶斯分类器
  8. matlab2c使用c++实现matlab函数系列教程-sawtooth函数
  9. 【性能优化】如何让APK瘦成一道闪电
  10. golang 打印变量类型