最近要實現一個車險特別約定內的值填空,但是又不想錄單員隨便在特別約定內亂錄入,畢竟這是要列印到保單上面的,
所以考慮在在特別約定模板內增加部分文本彈出錄入後替換,所以用到了Regex.
VC6使用Regex的話,有很多選擇,最主要我覺得有兩種:一種是使用boost的Regex庫,還要一種是現在介紹的以com的方式調用的vbscript.dll了。
其中,我個人傾向於使用vbscript.dll的Regex庫,原因:主要是,感覺這麼小的功能,沒必要動用boost這樣的牛刀,殺這樣一隻螞蟻也不太合適,所以
還是使用vbscript.dll,而且這個使用這個也有很多優點的,在win平台下,該dll是系統內建的,在system32裡面。而且,考慮到一個問題,boost庫的正則
運算式似乎與.net裡面的有些許區別,而且javascript裡面用的Regex庫也是這個,總而言之,比較熟!
廢話有點多,總而言之,用這個好!
進入正題了,首先用vc以資源的方式開啟C:\Windows\System32\vbscript.dll,注意以資源的方式開啟,預設是auto,那就只是看到一個vbscript.dll了。
選擇typelib的第二項,選擇匯出成RegExp.tlb
然後將RegExp.tlb拷到工程目錄下,在stdafx.h裡面加一句
#import "RegExp.tlb"
因為要調用com所以在InitInstance裡面
if(!AfxOleInit())
AfxMessageBox("Initial Failure");
然後寫個函數試一下
UpdateData();
VBScript_RegExp_10::IRegExpPtr pRegExp;
HRESULT hr;
hr = pRegExp.CreateInstance(__uuidof(VBScript_RegExp_10::RegExp));
if(FAILED(hr)){
MessageBox("無法建立Regex對象!");
return;
}
pRegExp->PutPattern((_bstr_t)(const char *)m_strPattern);/*Regex*/
/**//*If the RegExp.Global property is False (the default), MatchCollection will contain only the first match.
If RegExp.Global is true, Matches> will contain all matches.*/
pRegExp->PutGlobal(VARIANT_TRUE);
VBScript_RegExp_10::IMatchCollectionPtr pMC =
pRegExp->Execute((_bstr_t)(const char *)m_strContent);/*要匹配的內容*/
VBScript_RegExp_10::IMatchPtr pM;
CString sTxt;
for(int i=0;i<pMC->Count;i++){
pM = pMC->GetItem(i);
sTxt = (char *)pM->GetValue();
MessageBox(sTxt,"匹配項");
}
pRegExp.Release();
發張靚圖: