青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

簡介Boost.Regex

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

簡介1
    正 則表達(dá)式(Regular expression)是一種在文本處理中經(jīng)常用到的模式匹配的形式,可能許多用戶熟悉Unix下的grep,sed,awk等工具或者perl語言,它 們都廣泛地用到了正則表達(dá)式。傳統(tǒng)的C++用戶還受限于用POSIX C API's(Portable operateing system interface standard)來操作正則表達(dá)式,而regex++已經(jīng)提供了這些API's,雖然它不一定是使用POSIX C 正則表達(dá)式庫的最好方法。比如regex++能處理寬字符字符串(wide character strings),或者搜索、替換操作(在某種意義上類似于sed或perl),這些在傳統(tǒng)的C 庫中是不能實(shí)現(xiàn)的。
類boost::reg_expression是regex++庫中的關(guān)鍵類,它表示“機(jī)器可讀”的正則表達(dá)式,reg_expression 是在string的基礎(chǔ)之上構(gòu)建的,可以認(rèn)為它是一個具有string的功能,外加這個正則表達(dá)式算法所需要的狀態(tài)機(jī)。
像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位數(shù)字組成的 號碼,其中每四位一組,用空格或連字號隔開。在將這些信用卡號碼存入數(shù)據(jù)庫之前,我們難道不要檢驗(yàn)這些數(shù)字是否符合正確格式么?為了匹配任何一個數(shù)字我們 可以用正則表達(dá)式[0-9],數(shù)字串的寬度可以用[[:digit:]],當(dāng)然這些是POSIX標(biāo)準(zhǔn)。在regex++和perl中可簡化為\d(注意許 多老的庫傾向于硬編碼到C-locale,因此這不是什么問題)。下面的正則表達(dá)式可以檢驗(yàn)信用卡號碼的格式。
(\d{4}[- ]){3}\d{4}
    ()標(biāo)記子表達(dá)式,{4}表示重復(fù)4次。這僅是一個perl,awk,egrep的正則表達(dá)式的例子。regex++也支持那些sed,grep用到的比較老的“基本”語法,雖然它們很少用到,除非你需要重用一些已有的基本正則表達(dá)式。

    現(xiàn)在讓我們把這個表達(dá)式置于C++代碼中來檢驗(yàn)信用卡號碼的格式:

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

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

// 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);
}


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

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)類型都能被搜索,這為無縫搜索任何類型數(shù)據(jù)提供了可能性。

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

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

安裝和配置

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

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

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

最后只需添加<boost>根目錄到你的工程所包含的目錄列表中。沒有必要手動將*.lib文件加到工程中,因?yàn)樵陬^文件會選擇正確的.lib文件。
注意:如果想靜態(tài)地鏈入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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美成人精品福利| 国产一级揄自揄精品视频| 亚洲精品国久久99热| 国产精品麻豆成人av电影艾秋| 夜夜嗨av色综合久久久综合网 | 国产精品亚洲аv天堂网| 久久综合色播五月| 日韩亚洲国产欧美| 99国产精品一区| 亚洲人成毛片在线播放| 亚洲人www| 亚洲精品国产视频| 亚洲成人中文| 亚洲人成亚洲人成在线观看图片| 久久精品国产第一区二区三区| 在线欧美福利| 亚洲三级免费电影| 日韩一级在线观看| 亚洲一区尤物| 99亚洲伊人久久精品影院红桃| 在线观看欧美激情| 亚洲国产精品视频一区| 国产一区二区三区日韩欧美| 欧美日韩国语| 国产精品久久久久久影视| 国产精品午夜在线| 伊人狠狠色j香婷婷综合| 国产精品永久免费视频| 激情视频一区二区三区| 亚洲高清不卡在线观看| 日韩午夜在线电影| 亚洲国产成人精品久久| 亚洲毛片av在线| 亚洲图片激情小说| 亚洲影视在线播放| 久久国产福利国产秒拍| 欧美a一区二区| 一区二区三区 在线观看视| 亚洲欧美日韩在线观看a三区| 国产亚洲观看| 日韩一级欧洲| 亚洲视频精选| 亚洲一区二区三区视频| 久久噜噜亚洲综合| 日韩一本二本av| 久久精品九九| 国产精品你懂的在线欣赏| 一色屋精品视频在线看| 小辣椒精品导航| 99天天综合性| 欧美aa国产视频| 伊人狠狠色丁香综合尤物| 欧美一区亚洲二区| 一本久久a久久精品亚洲| 免费看成人av| 亚洲国产三级在线| 蜜桃视频一区| 久久成人精品无人区| 国产精品成人一区二区网站软件| 一色屋精品视频免费看| 欧美在线你懂的| 亚洲图片在线观看| 欧美日韩精品综合| 一本一本大道香蕉久在线精品| 久久免费视频在线| 欧美伊人精品成人久久综合97| 欧美视频一区二区三区四区| 99av国产精品欲麻豆| 欧美激情一区二区三区成人| 免费一级欧美在线大片| 久久漫画官网| 曰本成人黄色| 亚洲国产专区校园欧美| 免费欧美网站| 一区二区三区三区在线| 一区二区久久久久| 国产精品一级在线| 久久久久综合一区二区三区| 午夜亚洲激情| 亚洲国产精品成人精品| 亚洲国产三级网| 欧美天天综合网| 久久国产直播| 久久影院午夜论| 日韩一级精品| 亚洲欧美视频在线观看| 亚洲国产成人久久综合一区| 亚洲狠狠婷婷| 国产精品久久久久77777| 久久久久久精| 欧美国产先锋| 欧美一二三区精品| 久久精品99国产精品酒店日本| 伊人一区二区三区久久精品| 亚洲精品国精品久久99热| 国产欧美日韩视频一区二区三区| 久久久精品五月天| 欧美精品亚洲一区二区在线播放| 亚洲一区二区在线免费观看视频| 亚洲欧美一区二区三区在线| 最新日韩在线| 欧美在线视频观看免费网站| 亚洲最新中文字幕| 性欧美超级视频| 欧美国内亚洲| 国产欧美一区二区精品仙草咪| 久久五月天婷婷| 欧美日韩中文字幕精品| 麻豆av福利av久久av| 亚洲一区二区三区四区中文| 在线不卡中文字幕| 亚洲性视频h| 日韩图片一区| 另类国产ts人妖高潮视频| 亚洲欧美日韩精品一区二区| 欧美α欧美αv大片| 久久亚洲欧美国产精品乐播| 国产精品精品视频| 亚洲欧洲在线免费| 亚洲电影免费观看高清完整版在线观看 | 久久一区二区视频| 一区二区欧美激情| 久久精品三级| 亚洲欧美一区二区精品久久久| 先锋亚洲精品| 国产精品电影网站| 日韩小视频在线观看专区| 亚洲精品国产精品国自产观看| 久久久在线视频| 国产欧美日韩精品丝袜高跟鞋 | 亚洲欧洲日本mm| 亚洲国产精品v| 美国成人毛片| 欧美国产三区| 亚洲国内自拍| 欧美国产日韩在线观看| 亚洲第一偷拍| 99在线|亚洲一区二区| 欧美美女日韩| 亚洲手机在线| 久久se精品一区二区| 国产日韩一区二区三区在线播放| 一区二区日韩免费看| 亚洲欧美一区二区三区极速播放| 欧美日韩午夜| 亚洲男人影院| 狂野欧美激情性xxxx欧美| 在线观看中文字幕亚洲| 欧美国产视频日韩| 亚洲特级毛片| 看片网站欧美日韩| 99国产一区二区三精品乱码| 国产精品久久久久久久app| 亚洲欧美激情在线视频| 美日韩丰满少妇在线观看| 亚洲韩日在线| 欧美日韩国产成人在线| 亚洲欧美激情视频| 欧美不卡视频一区发布| 一区二区三区精品| 国产精品综合久久久| 欧美成人dvd在线视频| 欧美黄色免费网站| 99www免费人成精品| 欧美一级大片在线观看| 国产一区二区剧情av在线| 久久久综合精品| 亚洲精品专区| 久久―日本道色综合久久| av不卡在线观看| 国产伦精品一区二区三区照片91| 午夜在线成人av| 91久久精品一区二区三区| 午夜日韩视频| 日韩视频一区| 国产噜噜噜噜噜久久久久久久久| 久久激情五月丁香伊人| 日韩一区二区免费看| 巨胸喷奶水www久久久免费动漫| 日韩一二三在线视频播| 国产综合久久久久影院| 欧美三级免费| 免费看av成人| 久久成人久久爱| 亚洲午夜激情网页| 亚洲经典在线看| 美女国产一区| 欧美一区日韩一区| 一区二区三区高清在线| 亚洲国产另类久久精品| 国产亚洲欧美一区| 国产精品久久久久久久9999 | 欧美日韩亚洲91| 另类天堂av| 久久久久久久久久码影片| 在线亚洲美日韩| 99精品欧美一区| 亚洲精品乱码视频 | 一区二区日韩免费看| 欧美高清在线视频|