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