ATL正規表示式庫使用

2021-04-08 17:03:36 字數 4032 閱讀 7846

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、

乙個小示例

下面這個例子**於

msdn

,演示了

catlregexp

和catlrematchcontext

類的典型使用方法:

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

(:)?(//)?(?)?(#)?

以()為分界標誌,共分成

5組,第一組是:,

^是「非

」後面成員的意思,那麼也就是說第一組從開頭開始,一直到:、

/、?、

#其中任何乙個結束。聯絡後面的待匹配字串就可以得出所匹配的結果是

、自定義匹配字串的縮寫形式

為了方便,

atl已經幫我們定義了一些經常用到的正規表示式的簡略形式。例如:

/d代表

([0-9])、/n

代表(/r|(/r?/n))

等。這些縮寫形式都體現在

catlrechartraitsa/catlrechartraitsw

等類中,把這些類作為模板引數傳遞給

catlregexp

和catlrematchcontext

,我們就可以定義自己的匹配字串縮寫了。

class catlrechartraitsa

;

return s_szabbrevs;

} };

以上是atlrx.h

摘錄下來的**,可以很清楚地看到

atl是通過乙個

getabbrevs

()函式來定義字串縮寫的。要定義新的縮寫形式,我們只需要這樣:

clas**yregtraits : 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元件的時候,更可以方便地利用正則庫的巨大威力。

由於本人學識所限,文章內容錯在所難免,如有批評指正之詞,請

mail

[email protected]

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 初始化 與...