• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            簡介Boost.Regex

            Posted on 2008-07-20 10:31 RichardHe 閱讀(1102) 評論(0)  編輯 收藏 引用 所屬分類: [轉]

            簡介1
                正 則表達式(Regular expression)是一種在文本處理中經常用到的模式匹配的形式,可能許多用戶熟悉Unix下的grep,sed,awk等工具或者perl語言,它 們都廣泛地用到了正則表達式。傳統的C++用戶還受限于用POSIX C API's(Portable operateing system interface standard)來操作正則表達式,而regex++已經提供了這些API's,雖然它不一定是使用POSIX C 正則表達式庫的最好方法。比如regex++能處理寬字符字符串(wide character strings),或者搜索、替換操作(在某種意義上類似于sed或perl),這些在傳統的C 庫中是不能實現的。
            類boost::reg_expression是regex++庫中的關鍵類,它表示“機器可讀”的正則表達式,reg_expression 是在string的基礎之上構建的,可以認為它是一個具有string的功能,外加這個正則表達式算法所需要的狀態機。
            像std::basic_string一樣,它提供了兩個針對char和wchar_t的特化版本:

            namespace boost{
            template <class charT,
                      class traits = regex_traits<charT>,
                      class Allocator = std::allocator<charT> >
            class basic_regex;
            typedef basic_regex<char> regex;
            typedef basic_regex<wchar_t> wregex;
            }

                要知道regex++庫到底有什么用?可以試想我們要寫一個信用卡處理程序。信用卡通常有16位數字組成的 號碼,其中每四位一組,用空格或連字號隔開。在將這些信用卡號碼存入數據庫之前,我們難道不要檢驗這些數字是否符合正確格式么?為了匹配任何一個數字我們 可以用正則表達式[0-9],數字串的寬度可以用[[:digit:]],當然這些是POSIX標準。在regex++和perl中可簡化為\d(注意許 多老的庫傾向于硬編碼到C-locale,因此這不是什么問題)。下面的正則表達式可以檢驗信用卡號碼的格式。
            (\d{4}[- ]){3}\d{4}
                ()標記子表達式,{4}表示重復4次。這僅是一個perl,awk,egrep的正則表達式的例子。regex++也支持那些sed,grep用到的比較老的“基本”語法,雖然它們很少用到,除非你需要重用一些已有的基本正則表達式。

                現在讓我們把這個表達式置于C++代碼中來檢驗信用卡號碼的格式:

            bool validate_card_format(const std::string s)
            {
               static const boost::regex e("(
            \\d{4}[- ]){3}\\d{4}");
               return regex_match(s, e);
            }

                注意我們以前是如何將某些額外的轉義序列(或者翻譯成:轉義字符)添加到表達式的:要知道,正則表達式引擎處理轉義字符前,該轉義字符只能被 C++編譯器識別一次,因此,在C++代碼中嵌入正則表達式的轉義字符必須雙寫(寫兩次)。
                還要注意到你的編譯器必須支持Koening lookup 2(比如VC6就不支持),否則你需要附加一些boost::prefixes到某些函數引用中。
                那 些熟悉信用卡操作的人,可能還會想到上面的那種格式適合于人的閱讀,并不表示網上信用卡系統要求的格式(可能是16或15個沒有間隔符的數字串)。我們需 要一種簡單的轉換方法,我們需要2個字符串,1個是正則表達式,一個是格式字符串(提供一種被匹配的內容的描述)。在regex++中,search和 replace都能完成regex_merge算法,對于信用卡的例子我們給出了下面2個算法用于格式轉換:

            // match any format with the regular expression:
            const boost::regex e("
            \\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z");
            const std::string machine_format("
            \\1\\2\\3\\4");
            const std::string human_format("
            \\1-\\2-\\3-\\4");

            std::string machine_readable_card_number(const std::string s)
            {
               return regex_merge(s, e, machine_format, boost::match_default | boost::format_sed);
            }

            std::string human_readable_card_number(const std::string s)
            {
               return regex_merge(s, e, human_format, boost::match_default | boost::format_sed);
            }


                這兒,我們用正則表達式中的子式把號碼分為4塊,format string 用類似sed的語法把被匹配的內容替換為規定格式。
                上面的例子中,我們還沒有直接操作匹配結果,匹配結果包括全體匹配和一些子式的匹配。當需要正則表達式的匹配結果時,就需要用到class match_results的實例,下面是常用類型的特化版本:

            namespace boost{
            typedef match_results<const char*> cmatch;
            typedef match_results<const wchar_t*> wcmatch;
            typedef match_results<std::string::const_iterator> smatch;
            typedef match_results<std::wstring::const_iterator> wsmatch;
            }

                regex_search和regex_grep算法都使用到match_result。
                注意這些算法并不局限于一般的C-strings,任何雙向迭代器(bidirectional iterator)類型都能被搜索,這為無縫搜索任何類型數據提供了可能性。

                對于那些不喜歡模板(templates)的人還可以使用class RegEx,它是對模板代碼的高層次包裝,它為那些使用不到庫的整個功能的人提供了簡單的接口,當然它僅支持窄字符(narrow character)和“擴展”的正則表達式語法。
                對于想兼容POSIX的人可以使用POSIXAPI函數:regcomp,regexec,regfree,regerror,這些對narrow character和Unicode都適用。

                最后注意,這個庫現在支持運行時本地化(run-time localization),它能完全識別POSIX正則表達式語法,包括一些多字符的元素比較和同等類型的高級特性,它還能兼容其它一些正則表達式庫包括GNU、BSD4的regex包。

            安裝和配置

                首先當你從zip文件解壓本庫時必須保留它的內部結構,如果你沒這樣做,那只好刪除你解壓的文件,重現來一次。
                由于支持大多數常見的編譯器/標準庫/平臺,這個庫不需要作使用前的配置。如果你碰到配置問題,或想測試你的編譯器的配置信息,可以參考 配置文檔(這和boost的其它所有的庫的處理過程都一樣)。

                由于本庫混合了模板代碼(頭文件中)和靜態代碼數據(cpp文件中),所以在你使用之前,必須將庫支持的代碼 生成到庫內和檔案文件中。以下是幾個具體平臺的操作步驟:
            Borland C++ Builder

            Microsoft Visual C++ 6 and 7
            如果你使用VC5,你可能要找一下本庫的以前版本。
            打開命令提示符(其MSVC環境變量必須已定義,如果沒有可運行Vcvars32.bat,位于<VC6>\bin),進入<boost>\libs\regex\build 目錄
            選擇正確的makefile,VC6++的是vc6.mak,支持STLPort的是vc6-stlport.mak
            如下調用
            nmake -fvc6.mak
            如果想在VC6子目錄包含所有的lib、dll文件,lib文件拷在<VC6>\lib,dll文件拷在<VC6>\bin,可使用
            nmake -fvc6.mak install
            刪除生成過程中所有的臨時文件,可使用
            nmake -fvc6.mak clean

            最后只需添加<boost>根目錄到你的工程所包含的目錄列表中。沒有必要手動將*.lib文件加到工程中,因為在頭文件會選擇正確的.lib文件。
            注意:如果想靜態地鏈入regex庫,可定義BOOST_REGEX_STATIC_LINK(在release版中生效)。
                  如果想直接使用源文件,可定義BOOST_REGEX_NO_LIB,這樣自動選擇庫將失效。

            1.簡介出處:http://www.boost.org/libs/regex/doc/introduction.html
            2.Koening lookup:When a function is called, in order to determine if that function is visible in the current scope, the namespaces in which the functions parameters reside must be taken into account.

             
             

            posts - 94, comments - 138, trackbacks - 0, articles - 94

            Copyright © RichardHe

            久久人人爽人人爽人人片AV麻豆 | 亚洲熟妇无码另类久久久| 久久人人添人人爽添人人片牛牛| 亚洲а∨天堂久久精品9966| 久久亚洲日韩看片无码| 久久精品国产亚洲AV无码偷窥| 99热精品久久只有精品| 国产精品99久久不卡| 久久er国产精品免费观看8| 久久www免费人成看片| 伊人久久大香线蕉影院95| 久久婷婷人人澡人人| 久久久婷婷五月亚洲97号色| 一本伊大人香蕉久久网手机| 亚洲综合熟女久久久30p| 成人国内精品久久久久影院VR| 亚洲av日韩精品久久久久久a| 国内精品伊人久久久久网站| 日韩av无码久久精品免费| 国产精品99久久久久久宅男 | 青青草国产精品久久久久| 色狠狠久久综合网| 国产综合精品久久亚洲| AAA级久久久精品无码片| 97香蕉久久夜色精品国产| 久久精品国产亚洲7777| 久久青青草原国产精品免费| 午夜久久久久久禁播电影| 国产精品99久久久久久宅男小说| 国产精品久久久99| 久久99热这里只有精品国产| 亚洲综合婷婷久久| 久久精品一区二区| 久久精品国产福利国产秒| 日本人妻丰满熟妇久久久久久| 久久笫一福利免费导航| 久久久久波多野结衣高潮| 亚洲狠狠婷婷综合久久久久| 18岁日韩内射颜射午夜久久成人| 四虎国产精品成人免费久久| 久久久久亚洲国产|