ATL正規表示式庫與CAtlRegExp的使用

2021-07-11 03:22:00 字數 3924 閱讀 3576

1.catlregexp類

宣告:

template

class catlregexp;

初始化:

與微軟的greta類庫(微軟研究院推出的另乙個正規表示式類庫)不同,catlregexp並沒有在建構函式中提供初始化匹配字串的方法,而是讓使用者通過呼叫它的parse()方法,使用正規表示式字串作為引數,就可以構造出乙個我們所需要的用於匹配的類,例如我們需要匹配一種時間格式,可以是h:mm,也可以是hh:mm,那麼我們可以這樣構造我們的catlregexp類:

catlregexp <> re;

re.parse( ":" );

atl的正規表示式語法和perl的正規表示式語法大同小異,不過有乙個值得注意的地方就是atl中用大括號()表示其匹配字串中的group,我們上面的表示式中,就宣告了2個group,乙個是[0-9]?[0-9],另乙個是[0-9][0-9]。

catlregexp::parse

atl server library reference

catlregexp::parse

call this method to parse a regular expression.

reparseerror parse(

const rechar* szre,

bool bcasesensitive = true

);匹配:

呼叫catlregexp的match()方法,就可以用該類來進行匹配了,match方法的原型如下:

bool match(const rechar *szin,

catlrematchcontext*pcontext,

const rechar **ppszend=null)

引數的含義很明顯,不過需要注意到第乙個引數的型別是:const rechar * szin,是乙個const指標,這表明我們可以方便得使用std::string類的c_str()方法給其傳遞引數。

match的結果通過第二個引數pcontext所指向的catlrematchcontext < > 類來返回,match的結果及其相關資訊都被存放在catlrematchcontext類中,我們只要訪問catlrematchcontext的方法和成員就可以得到匹配的結果。

2.catlrematchcontext類

宣告:

template

class catlrematchcontext

使用:

catlrematchcontext通過m_unumgroups成員以及getmatch()方法向呼叫者提供匹配的結果資訊。m_unumgroups代表匹配上的group有多少組,getmatch()則根據傳遞給它的group的index值,返回匹配上的字串的pstart和pend指標,呼叫者有了這兩個指標,自然可以很方便的得到匹配結果。

3.乙個小示例

#include "stdafx.h"

#include

int main(int argc, char* argv)

:)?(//)?(?)?(#)?" );

if (reparse_error_ok != status)

catlrematchcontext<> mcurl;

if (!reurl.match("",

&mcurl))

for (uint ngroupindex = 0; ngroupindex < mcurl.m_unumgroups;++ngroupindex) }

輸出: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

;return s_szabbrevs;}};

以上是atlrx.h摘錄下來的**,可以很清楚地看到atl是通過乙個getabbrevs()函式來定義字串縮寫的。要定義新的縮寫形式,我們只需要這樣:

class myregtraits : public atl::catlrechartraitsa

;return s_szabbrevs;}};

讓我們自己定義的trait類繼承自catlrechartraitsa,然後改寫getabbrevs()函式,增加一些需要的簡寫就可以被使用了。下面的**示例了使用了我們自己的類中定義的「\e」簡略表達:

int main ( )

只要在構造atl::catlregexp和 atl::catlrematchcontext類時,傳遞過去我們的myregtraits類作為traits的引數,就可以直接使用自己定義的簡略符號了。

5.catlregexp對中文的支援

在catlregexp中,預設使用catlrechartraits,實際上是catlrechartraitsa

要支援ansi模式下的中文,必須使用catlrechartraitsmb,見如下**:

注意要包含#include 。

char* sztext="測試一下位址[email protected]看看\r\n";

//匹配電子郵件位址的正規表示式

char* szregexpemail="()";

catlregexp<catlrechartraitsmb> reemail;

reparseerror reerror=reemail.parse((const atl::catlregexp::rechar *)szregexpemail);

if (reparse_error_ok != reerror)

return;

catlrematchcontext<catlrechartraitsmb> mcemail;

if (!reemail.match((const atl::catlregexp::rechar *)sztext,&mcemail))

char szbuf[260];

for (uint ngroupindex = 0; ngroupindex < mcemail.m_unumgroups;++ngroupindex)

輸出:[email protected]

6.結尾

雖然現在c++的社群裡已經擁有了boost::regex,greta等非常著名的正規表示式庫,可是作為vc++自帶的模板庫,atl中的正規表示式庫仍然給我們的工作提供了極大的便利。由於atl是微軟官方發布的library,所以它擁有良好的文件說明、嚴格的測試以及微軟官方的技術支援。另外在用atl開發com元件的時候,更可以方便地利用正則庫的巨大威力。

原文:1.

2.在msdn中:ms-help:

其他參考: 

ATL正規表示式庫使用

www.csdn.net中,由於atl server的需要,需要對client傳送過來的位址 命令等複雜文字字段資訊解碼,而正規表示式是公認的最強大的文字解析工具,所以,atl提供了一些用於正規表示式的庫方便了我們的工作。atl 1 catlregexp類 宣告 template class cat...

ATL正規表示式庫使用

atl正規表示式庫使用 http www.csdn.net atl中,由於atl server的需要,需要對client傳送過來的位址 命令等複雜文字字段資訊解碼,而正規表示式是公認的最強大的文字解析工具,所以,atl提供了一些用於正規表示式的庫方便了我們的工作。1 catlregexp類 宣告 t...

ATL正規表示式庫使用

atl 中,由於 atl server 的需要,需要對 client 傳送過來的位址 命令等複雜文字字段資訊解碼,而正規表示式是公認的最強大的文字解析工具,所以,atl提供了一些用於正規表示式的庫方便了我們的工作。1 catlregexp 類宣告 template class catlregexp ...