收藏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組,第一組是:,
^是「非
」後面成員的意思,那麼也就是說第一組從開頭開始,一直到:、
/、?、
#其中任何乙個結束。聯絡後面的待匹配字串就可以得出所匹配的結果是
。4、自定義匹配字串的縮寫形式
為了方便,
atl已經幫我們定義了一些經常用到的正規表示式的簡略形式。例如:
/d代表
([0-9])、/n
代表(/r|(/r?/n))
等。這些縮寫形式都體現在
catlrechartraitsa/catlrechartraitsw
等類中,把這些類作為模板引數傳遞給
catlregexp
和catlrematchcontext
,我們就可以定義自己的匹配字串縮寫了。
class catlrechartraitsa
;
return s_szabbrevs;
}
};以上是
atlrx.h
摘錄下來的**,可以很清楚地看到
atl是通過乙個
getabbrevs
()函式來定義字串縮寫的。要定義新的縮寫形式,我們只需要這樣:
classmyregtraits : 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 ...