来自 mm小游戏 2019-09-08 11:53 的文章
当前位置: 澳门新葡亰平台游戏 > mm小游戏 > 正文

可用的正则表达式库

gnuregex,PCRE,greta,boost,CAtlReg

 

其间 CAtlReg 和greta 是微软的,但是 greta 听别人讲已经积年累月不维护,不能在新式的编译器中编译.


只是作者看 PCRE 也是 二〇〇六 年的呀.

哦,应该从 进去,那多少个诚然是本子未最新的.

据说 "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 RECHA本田CR-V * 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, fragment
   REParseError 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]+)",        // integer
            NULL
        };

        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 match
    res1 = 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

本文由澳门新葡亰平台游戏发布于mm小游戏,转载请注明出处:可用的正则表达式库

关键词: