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

隨筆 - 17  文章 - 48  trackbacks - 0
<2015年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

常用鏈接

留言簿(3)

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜


去年花了兩三個星期的業余時間實現了基于DFA的正則引擎( ),時間一晃就過去一年,工作繁忙,興趣面廣,前途未卜什么的耗費太多精力,最近兩三個月抽了點時間寫了基于NFA的正則引擎,代碼放在Github

正則引擎常見的實現方法

正則的常見實現方式有三種:DFA、Backtracking、NFA:

  • DFA是三種實現中效率最高的,不過缺點也明顯,一是DFA的構造復雜耗時,二是DFA支持的正則語法有限。在早期正則被發明出來時,只有concatenation、alternation、Kleene star,即"ab" "a|b" "a*",DFA可以輕松搞定。隨著計算機的發展,正則像所有其它語言一樣發展出各種新的語法,很多語法在DFA中難以實現,比如capture、backreference(capture倒是有論文描述可以在DFA中實現)。

  • Backtracking是三種實現中效率最低的,功能確是最強的,它可以實現所有后面新加的語法,因此,大多數正則引擎實現都采用此方法。因為它是回溯的,所以在某些情況下會出現指數復雜度,這篇文章有詳細的描述。

  • NFA(Thompson NFA)有相對DFA來說的構造簡單,并兼有接近DFA的效率,并且在面對Backtracking出現指數復雜度時的正則表達式保持良好的性能。

NFA-based的實現

這里描述的NFA是指Thompson NFA。Thompson NFA實現的核心是對于正則表達式多個可能的匹配并發的向前匹配,此過程是在模擬DFA運行。比如對于正則表達式"abab|abbb"匹配字符串"abbb":

  • Backtracking的匹配過程是取正則的第一個子表達式"abab"匹配,前兩個字符匹配成功,匹配第三個字符的時候失敗,這時引擎回溯選擇第二個子表達式"abbb"匹配,最終匹配成功。

  • Thompson NFA是同時取兩個子表達式"abab"和"abbb"匹配,前兩個字符匹配時,兩個子表達式都能匹配成功,當匹配第三個字符時,子表達式"abab"匹配失敗,因此丟棄,"abbb"匹配成功接著匹配,最終匹配成功。

上面是一個簡單的例子,沒有出現"*" "+" "{m,n}"這種復雜的metacharacters,在處理這種repeat的metacharacter時Thompson NFA優勢更加明顯。

在實際復雜的正則表達式中,NFA構造是必然會產生一堆epsilon邊,這在第二篇文章中有描述。上面描述Thompson NFA實際是在模擬DFA運行,在每個字符匹配完成之后需要跳過epsilon邊得到后面要匹配的并發的狀態集合,這樣持續的并發匹配下去,當字符串匹配完成時只要有一個達到了接受狀態,就是匹配成功,若這個集合為空,那表示匹配失敗。

在我的實現中,構造了一組狀態和由這組狀態加epsilon邊集合構造的有向圖,每個狀態有自己的狀態類型,分為兩種:

  • 一種是匹配狀態類型,即用來匹配字符的狀態,若字符匹配成功,則進入下一個狀態;

  • 一種是操作狀態類型,即不匹配字符的狀態,在每個字符匹配結束之后若到達這些狀態,則會進行相應的操作,比如repeat狀態,記錄匹配計數,并判斷匹配計數是否完成再決定是否進入的下面的狀態。

repeat是一種會分化的狀態,達到最小匹配次數時,可以接著往下走,也可以繼續重復匹配repeat的子正則表達式,這樣就分化成兩條線了,并且每條線都帶有自己的狀態數據,因此,我的實現中引入的thread來表示一條匹配線,里面有狀態數據。

Match和Search

狀態構造完成了之后,就要開始匹配了。匹配有兩種,一種是match,即一個正則表達式能否完整匹配一個字符串,若完整匹配則匹配成功;另一種是search,要在一個字符串中或者一塊buffer中查找每個滿足的匹配。這里就有個問題,從第一個字符開始匹配,匹配了幾個字符之后發現匹配失敗了怎么辦呢?回退到第二個字符重新匹配?我們知道對于普通的字符串查找,有KMP算法可以保證不回退字符(其實KMP算法的預處理就是構造DFA),或者有Boyer-Moore算法盡量回退少的字符個數。對于正則這種復雜的匹配該怎么辦呢?從上面的Thompson NFA的描述可以知道匹配過程是多條線并發匹配,因此可以構造一個始終產生一條新線的狀態,若匹配在前面的線失敗被丟棄之后,后面的新線始終可以補上,這樣查找的過程就不再需要回退字符了。

我的實現中,狀態構造完成后是這樣的:

    // |-----|--------|---------------|-----|-------------|
    
// | any | repeat | capture begin |  | capture end |
    
// |-----|--------|---------------|-----|-------------|

用repeat-any來產生新的匹配線。若在match模式下,則從第三個狀態開始匹配,不會產生新的匹配線,一旦匹配過程失敗了就失敗了。

結語

正則表達式語法一直在擴展,新的語法有些很難在DFA和NFA中實現,而在Backtracking中的實現又是以犧牲性能為代價。因此有些正則表達式實現會結合多種實現方式,判斷正則表達式的類型選擇不同的引擎,比如普通字符串加上一些簡單的正則語法采用DFA引擎匹配,或者只有普通字符串的匹配可以用Boyer-Moore算法,畢竟Boyer-Moore算法在普通文本查找中要優于KMP算法:),對于復雜的正則表達式采用Backtracking,甚至有些正則引擎使用JIT來加速。

posted on 2014-09-15 19:04 airtrack 閱讀(3210) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            老牛国产精品一区的观看方式| 久久精品在线播放| 亚洲精品久久久久中文字幕欢迎你| 国产视频亚洲精品| 久久久一区二区| 亚洲国产成人porn| 国产精品igao视频网网址不卡日韩| 欧美激情一区| 一区二区三区三区在线| 久久精品99国产精品日本| 亚洲欧美伊人| 亚洲黄色在线看| 老司机成人网| 美日韩精品视频| 韩国欧美一区| 韩国精品在线观看| 欧美日韩国产在线播放| 国产精品视频| 国产亚洲欧美激情| 欧美视频在线观看视频极品 | 香蕉久久久久久久av网站| 亚洲欧美成人| 一区二区在线免费观看| 国产精品久久精品日日| 国产精品视频最多的网站| 欧美经典一区二区三区| 国产精品久久久久影院色老大 | 欧美激情亚洲自拍| 国产一区在线视频| **网站欧美大片在线观看| 国产视频欧美视频| 亚洲精品麻豆| 亚洲伦理精品| 久久久久久国产精品一区| 亚洲欧美制服另类日韩| 亚洲黄网站黄| 欧美在线观看你懂的| 久久久久久久999| 亚洲视频一二| 亚洲精品美女在线观看| 在线 亚洲欧美在线综合一区| 亚洲精品在线免费观看视频| 在线免费观看日本一区| 激情久久综艺| 亚洲国产欧美在线| 亚洲精品乱码久久久久久蜜桃91| 欧美三级午夜理伦三级中文幕 | 香蕉久久夜色| 亚洲一区在线播放| 在线亚洲高清视频| 国产精品福利网| 欧美成人午夜视频| 激情久久一区| 最新国产成人在线观看| 久久国产精品久久精品国产| 久久人人爽人人爽爽久久| 亚洲视频在线一区| 销魂美女一区二区三区视频在线| 亚洲欧美制服中文字幕| 久久久.com| 一本色道久久综合狠狠躁篇怎么玩 | 久热精品视频在线| 久久综合色播五月| 欧美国产免费| 国产欧美一区二区三区另类精品| 国产一区二区三区四区| 最新日韩在线视频| 亚洲欧美国产精品桃花| 国产精品美女久久久久av超清| 国产欧美视频一区二区| 亚洲国产精品传媒在线观看| 一区二区三区四区五区精品| 久久精品免费| 亚洲人成网站精品片在线观看| 亚洲精品国产精品国自产在线| 亚洲免费影院| 欧美激情精品久久久久久黑人 | 亚洲一区免费看| 久久久午夜视频| 欧美三级小说| 亚洲国产精品www| 久久国产精品久久精品国产| 亚洲精品综合精品自拍| 久久精品国产999大香线蕉| 欧美日韩精品免费在线观看视频| 国产在线高清精品| 亚洲性视频h| 欧美激情小视频| 久久国内精品自在自线400部| 亚洲乱码国产乱码精品精可以看| 久久国产直播| 一本色道久久88综合亚洲精品ⅰ | 久久久久国产一区二区三区四区 | 亚洲一区二区三区777| 久久亚洲综合| 午夜精品福利电影| 亚洲视频1区| 欧美日韩精品久久| 亚洲精品网站在线播放gif| 久久精品欧洲| 亚洲一区二区三区四区中文 | 久久精品国产在热久久| 国产精品久久久久aaaa| 欧美—级在线免费片| 欧美精品v日韩精品v国产精品 | 一区二区三区四区五区在线 | 久久精品一区二区三区不卡| 国产精品美女在线| 一区二区三区四区五区精品视频| 欧美成人69| 久久九九国产精品怡红院| 亚洲高清视频一区| 免费日韩视频| 91久久精品日日躁夜夜躁国产| 亚洲欧美韩国| 久久综合久久久| 一区二区三区在线视频观看| 久久精品五月| 久久久久在线观看| 韩国美女久久| 卡一卡二国产精品| 久久女同精品一区二区| 亚洲高清视频在线观看| 亚洲大胆人体视频| 欧美韩国一区| 亚洲视频一二三| 亚洲一区二区在线播放| 国产欧美在线| 亚洲国产精品久久| 久久婷婷久久| 亚洲精品亚洲人成人网| 夜夜嗨av一区二区三区四区| 欧美不卡三区| 亚洲图色在线| 欧美自拍偷拍午夜视频| 激情一区二区三区| 亚洲免费在线| 欧美成人亚洲成人日韩成人| 国产欧美日韩三区| 亚洲自拍偷拍色片视频| 亚洲福利免费| 欧美一区二区三区视频在线| 国产亚洲一本大道中文在线| 一区二区三区黄色| 久久本道综合色狠狠五月| 欧美视频第二页| 久久久噜噜噜久久人人看| 免费久久99精品国产自| 欧美高清视频www夜色资源网| 国产三级欧美三级| 亚洲一区中文| 亚洲一区二区三区四区中文| 一区二区三区无毛| 中文精品99久久国产香蕉| 在线欧美电影| 亚洲视频欧洲视频| 欧美亚洲一级片| 亚洲精品中文在线| 亚洲欧美日韩一区二区| 曰本成人黄色| 亚洲伊人色欲综合网| 亚洲高清电影| 羞羞色国产精品| 亚洲人成小说网站色在线| 日韩亚洲在线观看| 狠狠色丁香久久婷婷综合丁香| 一本色道久久88综合日韩精品| 91久久久久久久久| 亚洲欧美在线免费| 亚洲一区二区三区激情| 免费在线欧美视频| 久久久久久精| 亚洲一区二区三区四区中文| 久久黄色网页| 欧美中文日韩| 欧美一进一出视频| 欧美午夜大胆人体| 日韩亚洲欧美精品| 亚洲精选视频在线| 欧美黄色成人网| 欧美成人国产一区二区| 国内精品亚洲| 亚洲欧美视频在线| 久久精品论坛| 欧美一区二区三区男人的天堂| 欧美人体xx| 一本一本a久久| 91久久黄色| 美脚丝袜一区二区三区在线观看| 久久久久国产一区二区三区四区 | 欧美亚洲专区| 一区二区精品| 一区二区激情小说| 久久精品视频在线| 狠狠色狠狠色综合日日五| 亚洲视频在线看| 欧美好吊妞视频| 久久成人精品无人区| 亚洲欧洲综合| 韩日精品视频|