ATL正規表示式庫使用

2021-09-30 15:06:52 字數 2836 閱讀 4447

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

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的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"

例子中所用的正規表示式為:

以()為分界標誌,共分成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、 結尾

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

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 ...