GRETA正則表達式模板類庫

字號:

本文摘要翻譯了幾篇文章的內(nèi)容,簡單介紹 ATL CAtlRegExp,GRETA,Boost::regex 等正則表達式庫,這些表達式庫使我們可以方便地利用正則庫的巨大威力,給我們的工作提供了便利。
    正則表達式語法 字符元意義.匹配單個字符[ ]指定一個字符類,匹配方括號內(nèi)的任意字符。例:[abc] 匹配 "a", "b"或 "c"。^如果^出現(xiàn)在字符類的開始處,它否定了字符類,這個被否定的字符類匹配除卻方括號內(nèi)的字符的字符。如:[^abc]匹配除了"a", "b"和"c"之外的字符。如果^出現(xiàn)在正則表達式前邊,它匹配輸入的開頭,例:^[abc]匹配以"a", "b"或"c"開頭的輸入。-在字符類中,指定一個字符的范圍。例如:[0-9]匹配"0"到"9"的數(shù)字。?指明?前的表達式是可選的,它可以匹配一次或不進行匹配。例如: [0-9][0-9]? 匹配"2"或"12"。+指明?前的表達式匹配一次或多次。例如:[0-9]+匹配"1", "13", "666"等。
    指明*前的表達式匹配零次或多次。??, +?, *??, +和*的非貪婪匹配版本,它們盡可能匹配較少的字符;而?, +和*則是貪婪版本,盡可能匹配較多的字符。例如:輸入"", 則<.*?> 匹配"",而<.*>匹配""。( )分組操作符。例如:(d+,)*d+匹配一串由逗號分開的數(shù)字,例如: "1"或"1,23,456"。轉(zhuǎn)義字符,轉(zhuǎn)義緊跟的字符。例如,[0-9]+ 匹配一個或多個數(shù)字,而 [0-9]+ 匹配一個數(shù)字后跟隨一個加號的情況。反斜杠也用于表示縮寫,a 就表示任何數(shù)字、字母。如果后緊跟一個數(shù)字n,則它匹配第n個匹配群組(從0開始),例如,<{.*?}>.*?匹配"Contents
    "。注意,在C++字符串中,反斜杠需要用雙反斜杠\來表示: "\+", "\a", "<{.*?}>.*?"。$放在正則表達式的最后,它匹配輸入的末端。例如:[0-9]$匹配輸入的最后一個數(shù)字。|間隔符,分隔兩個表達式,以正確匹配其中一個,例如:T|the匹配"The" 或"the"。
    縮寫匹配
    縮寫匹配a字母、數(shù)字([a-zA-Z0-9])空格(blank): ([ \t])c字母([a-zA-Z])d十進制數(shù) ([0-9])h十六進制數(shù)([0-9a-fA-F]) 換行: ( |( ? ))q引用字符串("[^"]*")|(''''[^'''']*'''')w一段文字 ([a-zA-Z]+)z一個整數(shù)([0-9]+)
    ATL CATLRegExp
    ATL Server常常需要對地址、命令等復雜文字字段信息解碼,而正則表達式是強大的文字解析工具,所以,ATL提供了正則表達式解釋工具。
    示例:
    #include "stdafx.h"
    #include
    int main(int argc, char* argv[])
    {
     CAtlRegExp<> reUrl;
     // five match groups: scheme, authority, path, query, fragment
     REParseError status = reUrl.Parse(
     "({[^:/?#]+}:)?(//{[^/?#]*})?{[^?#]*}(?{[^#]*})?(#{.*})?" );
     if (REPARSE_ERROR_OK != status)
     {
    // Unexpected error.
    return 0;
     }
     CAtlREMatchContext<> mcUrl;
     if (!reUrl.Match(
     "http://search.microsoft.com/us/Search.asp?qu=atl&boolean=ALL#results",
    &mcUrl))
     {
    // Unexpected error.
    return 0;
     }
     for (UINT nGroupIndex = 0; nGroupIndex < mcUrl.m_uNumGroups;
     ++nGroupIndex)
     {
    const CAtlREMatchContext<>::RECHAR* szStart = 0;
    const CAtlREMatchContext<>::RECHAR* szEnd = 0;
    mcUrl.GetMatch(nGroupIndex, &szStart, &szEnd);
    ptrdiff_t nLength = szEnd - szStart;
    printf("%d: "%.*s"
    ", nGroupIndex, nLength, szStart);
     }
    }   輸出:0: "http"
    1: "search.microsoft.com"
    2: "/us/Search.asp"
    3: "qu=atl&boolean=ALL"
    4: "results"
    Match的結(jié)果通過第二個參數(shù)pContext所指向的CAtlREMatchContext類來返回,Match的結(jié)果及其相關(guān)信息都被存放在CAtlREMatchContext類中,只要訪問CAtlREMatchContext的方法和成員就可以得到匹配的結(jié)果。CAtlREMatchContext通過m_uNumGroups成員以及GetMatch()方法向調(diào)用者提供匹配的結(jié)果信息。m_uNumGroups代表匹配上的Group有多少組,GetMatch()則根據(jù)傳遞給它的Group的Index值,返回匹配上的字符串的pStart和pEnd指針,調(diào)用者有了這兩個指針,自然可以很方便的得到匹配結(jié)果。