VC正則表達式的使用

正則表達式是一種對字符進行模糊匹配的一個公式。在數據有效性驗證,查找,替換文本中都可以使用正則表達式 。

本篇文章主要描述的是使用ATL中兩個模板類CAtlRegExp和CAtlREMatchContext。
在使用CAtlRegExp類之前需要添加#include <atlrx.h> 這個頭文件。
RegExp是Regular Expression的縮寫

以匹配郵件地址字符串爲例說明兩個類的使用

該示例更改自http://msdn.microsoft.com/en-us/library/k3zs4axe(VS.80).aspx


CString strRegex=L"({[0-9_]+@[a-zA-Z0-9]+[.][a-zA-Z0-9]+[.]?[a-zA-Z0-9]+})";
CString strInput;

strInput=L"[email protected]";
CAtlRegExp<CAtlRECharTraitsW> reRule;
wchar_t *wt = (wchar_t *)(LPCTSTR)strRegex;
REParseError status = reRule.Parse((const ATL::CAtlRegExp<CAtlRECharTraitsW>::RECHAR *)wt);

if (REPARSE_ERROR_OK != status)
{
return 0;
}

CAtlREMatchContext<CAtlRECharTraitsW> mcRule;
wt = (wchar_t *)(LPCTSTR)strInput;
if (!reRule.Match((const ATL::CAtlRegExp<CAtlRECharTraitsW>::RECHAR *)wt,&mcRule))
{
AfxMessageBox(L"您輸入的郵件地址不合法!");
}
else
{
for (UINT nGroupIndex = 0; nGroupIndex < mcRule.m_uNumGroups; ++nGroupIndex)
{
const CAtlREMatchContext<>::RECHAR* szStart = 0;
const CAtlREMatchContext<>::RECHAR* szEnd = 0;
mcRule.GetMatch(nGroupIndex, &szStart, &szEnd);
ptrdiff_t nLength = szEnd - szStart;
CString strEmailAddress(szStart, static_cast<int>(nLength));
if(strEmailAddress.Compare(strInput)!=0)
{
CString strPrompt;
strPrompt.Format(L"您輸入的郵件地址不合法,您要輸入%s 嗎!",strEmailAddress);
AfxMessageBox(strPrompt);
}
else
{
AfxMessageBox(L"輸入的郵件地址正確!");
}
}

}


這兩個模板類由另一個描述字符集特性的類參數化,可以是ASCII,WCHAR 或多字節。
可以將此忽略掉,因爲根據設置的字符集,模板類自動生成具體的類。

在atlrx.h文件中供選擇的有三個類

CAtlRECharTraitsA 用於ASCII
CAtlRECharTraitsW 用於UNICODE
CAtlRECharTraitsMB 用於多字節

在VC2005默認的字符集是使用Unicode字符集
根據正則的源碼

#ifndef _UNICODE
typedef CAtlRECharTraitsA CAtlRECharTraits;

#else // _UNICODE
typedef CAtlRECharTraitsW CAtlRECharTraits;
#endif // !_UNICODE


所以構造CAtlRegExp類可以是

CAtlRegExp<> reRule;

REParseError status = reRule.Parse((const ATL::CAtlRegExp<CAtlRECharTraitsW>::RECHAR *)wt);

也可以是

CAtlRegExp<CAtlRECharTraitsW> reRule;

REParseError status = reRule.Parse((const ATL::CAtlRegExp<CAtlRECharTraitsW>::RECHAR *)wt);
通過調用CAtlRegExp的Parse()方法,使用正則表達式字符串作爲參數,就可以構造出一個我們所需要的類。
調用CATLRegExp的Match()函數
Match()函數參數說明

第一個參數是要對比的字符串,
第二個參數是存儲match的結果
CAtlREMatchContext的成員變量m_uNumGroups表示匹配的Group

CAtlREMatchContext的GetMatch()函數返回匹配上的字符串的pStart和pEnd指針

MSDN的正在表達式語法

原文是http://msdn.microsoft.com/en-us/library/k3zs4axe(VS.80).aspx


關於語法翻譯可參考http://www.vckbase.com/document/viewdoc/?id=1138

摘錄

字符元意義
匹配單個字符
[ ]
指定一個字符類,匹配方括號內的任意字符。例:[abc] 匹配 "a", "b"或 "c"。
^
如果^出現在字符類的開始處,它否定了字符類,這個被否定的字符類匹配除卻方括號內的字符的字符。如:[^abc]匹配除了"a", "b"和"c"之外的字符。如果^出現在正則表達式前邊,它匹配輸入的開頭,例:^[abc]匹配以"a", "b"或"c"開頭的輸入。
-
在字符類中,指定一個字符的範圍。例如:[0-9]匹配"0"到"9"的數字。
?
指明?前的表達式是可選的,它可以匹配一次或不進行匹配。例如: [0-9][0-9]? 匹配"2"或"12"。
+
指明?前的表達式匹配一次或多次。例如:[0-9]+匹配"1", "13", "666"等。
*
指明*前的表達式匹配零次或多次。
??, +?, *?
?, +和*的非貪婪匹配版本,它們儘可能匹配較少的字符;而?, +和*則是貪婪版本,儘可能匹配較多的字符。例如:輸入"<abc><def>", 則<.*?> 匹配"<abc>",而<.*>匹配"<abc><def>"。
( )
分組操作符。例如:(/d+,)*/d+匹配一串由逗號分開的數字,例如: "1"或"1,23,456"。
/
轉義字符,轉義緊跟的字符。例如,[0-9]+ 匹配一個或多個數字,而 [0-9]/+ 匹配一個數字後跟隨一個加號的情況。反斜槓/也用於表示縮寫,/a 就表示任何數字、字母。如果/後緊跟一個數字n,則它匹配第n個匹配羣組(從0開始),例如,<{.*?}>.*?<//0>匹配"<head>Contents</head>"。注意,在C++字符串中,反斜槓/需要用雙反斜槓//來表示: "//+", "//a", "<{.*?}>.*?<///0>"。
$
放在正則表達式的最後,它匹配輸入的末端。例如:[0-9]$匹配輸入的最後一個數字。
|
間隔符,分隔兩個表達式,以正確匹配其中一個,例如:T|the匹配"The" 或"the"。

縮寫匹配
縮寫
匹配
/a
字母、數字([a-zA-Z0-9])
/b
空格(blank): ([ //t])
/c
字母([a-zA-Z])
/d
十進制數 ([0-9])
/h
十六進制數([0-9a-fA-F])
/n
換行: (/r|(/r?/n))
/q
引用字符串(/"[^/"]*/")|(/''''[^/'''']*/'''')
/w
一段文字 ([a-zA-Z]+)
/z
一個整數([0-9]+)

發佈了20 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章