vc 可用的正则表明式库

gnuregex,PCRE,greta,boost,CAtlReg

 

内部 CAtlReg 和greta 是微软的,可是 greta
据他们说已经积年累月不维护,无法在风行的编写翻译器中编写翻译.


不过自个儿看 PCRE 也是 二〇〇七 年的呀.
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()方法,
使用正则表明式字符串作为参数,就足以协会出3个我们所要求的用于匹配的类,例如我们要求般配一种时光格式,能够是h:mm、也得以是hh:mm,那么大家得以如此构造大家的CAtlRegExp类:

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

ATL的正则表明式语法和Perl的正则表明式语法齐齐哈尔小异,可是有三个值得注意的位置正是ATL中用大括号({
})表示其匹配字符串中的Group,大家地点的表明式中,就声称了一个Group,七个是[0-9]?[0-9],另1个是[0-9][0-9]。

匹配:
调用CATLRegExp的Match()方法,就能够用该类来拓展匹配了,Match方法的原型如下:

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

参数的意义很强烈,可是供给小心到第2个参数的型别是:const RECHA奥迪Q5 *
szIN,是2个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指针,调用者有了那多少个指针,自然能够很便利的获得匹配结果。

③ 、 多少个小示例

下边那么些事例来源于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组,第三组是{[^:/?#]+}:,^是“非”前面成员的意趣,那么相当于说第3组从上马开端,平昔到:、/、?、#中间任何二个了却。联系前面包车型客车待匹配字符串就足以得出所匹配的结果是http。

四 、 自定义匹配字符串的缩写情势

为了便利,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是因而1个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