久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

正則表達式話題

From: www.regexlab.com

引言

    本文將逐步討論一些正則表達式的使用話題。本文為本站基礎篇之后的擴展,在閱讀本文之前,建議先閱讀正則表達式參考文檔一文。


1. 表達式的遞歸匹配

    有時候,我們需要用正則表達式來分析一個計算式中的括號配對情況。比如,使用表達式 “( [^)]* )” 或者 “( .*? )” 可以匹配一對小括號。但是如果括號內還嵌有一層括號的話,如 “( ( ) )”,則這種寫法將不能夠匹配正確,得到的結果是 “( ( )” 。類似情況的還有 HTML 中支持嵌套的標簽如 “<font> </font>” 等。本節將要討論的是,想辦法把有嵌套的的成對括號或者成對標簽匹配出來。

匹配未知層次的嵌套:

    有的正則表達式引擎,專門針對這種嵌套提供了支持。并且在棧空間允許的情況下,能夠支持任意未知層次的嵌套:比如 Perl,PHP,GRETA 等。在 PHP 和 GRETA 中,表達式中使用 “(?R)” 來表示嵌套部分。

    匹配嵌套了未知層次的 “小括號對” 的表達式寫法如下:”(  ([^()]  |  (?R))*  )”。

    [Perl 和 PHP 的示例代碼]

匹配有限層次的嵌套:

    對于不支持嵌套的正則表達式引擎,只能通過一定的辦法來匹配有限層次的嵌套。思路如下:

    第一步,寫一個不能支持嵌套的表達式:”( [^()]* )”,”<font>((?!</?font>).)*</font>”。這兩個表達式在匹配有嵌套的文本時,只匹配最內層。

    第二步,寫一個可匹配嵌套一層的表達式:”( ([^()] | ( [^()]* ))* )”。這個表達式在匹配嵌套層數大于一時,只能匹配最里面的兩層,同時,這個表達式也能匹配沒有嵌套的文本或者嵌套的最里層。

    匹配嵌套一層的 “<font>” 標簽,表達式為:”<font>((?!</?font>).|(<font>((?!</?font>).)*</font>))*</font>”。這個表達式在匹配 “<font>” 嵌套層數大于一的文本時,只匹配最里面的兩層。

    第三步,找到匹配嵌套(n)層的表達式 與 嵌套(n-1)層的表達式之間的關系。比如,能夠匹配嵌套(n)層的表達式為:

    [標記頭]  ( [匹配 [標記頭] 和 [標記尾] 之外的表達式] | [匹配 n-1 層的表達式] )*  [標記尾]

    回頭來看前面編寫的“可匹配嵌套一層”的表達式:

  ( ( [^()] | (([^()])*) )* )
<font> ( (?!</?font>). | (<font>((?!</?font>).)*</font>) )* </font>
             
PHP 和 GRETA 的簡便之處在于,匹配嵌套(n-1)層的表達式用 (?R) 表示:
( ( [^()] | (?R) )* )

    第四步,依此類推,可以編寫出匹配有限(n)層的表達式。這種方式寫出來的表達式,雖然看上去很長,但是這種表達式經過編譯后,匹配效率仍然是很高的。


2. 非貪婪匹配的效率

    可能有不少的人和我一樣,有過這樣的經歷:當我們要匹配類似 “<td>內容</td>” 或者 “[b]加粗[/b]” 這樣的文本時,我們根據正向預搜索功能寫出這樣的表達式:”<td>([^<]|<(?!/td>))*</td>” 或者 “<td>((?!</td>).)*</td>”。

    當發現非貪婪匹配之時,恍然大悟,同樣功能的表達式可以寫得如此簡單:”<td>.*?</td>”。頓時間如獲至寶,凡是按邊界匹配的地方,盡量使用簡捷的非貪婪匹配 “.*?”。特別是對于復雜的表達式來說,采用非貪婪匹配 “.*?” 寫出來的表達式的確是簡練了許多。

    然而,當一個表達式中,有多個非貪婪匹配時,或者多個未知匹配次數的表達式時,這個表達式將可能存在效率上的陷阱。有時候,匹配速度慢得莫名奇妙,甚至開始懷疑正則表達式是否實用。

效率陷阱的產生:

    在本站基礎文章里,對非貪婪匹配的描述中說到:“如果少匹配就會導致整個表達式匹配失敗的時候,與貪婪模式類似,非貪婪模式會最小限度的再匹配一些,以使整個表達式匹配成功。”

    具體的匹配過程是這樣的:

  1. “非貪婪部分” 先匹配最少次數,然后嘗試匹配 “右側的表達式”。
  2. 如果右側的表達式匹配成功,則整個表達式匹配結束。如果右側表達式匹配失敗,則 “非貪婪部分” 將增加匹配一次,然后再嘗試匹配 “右側的表達式”。
  3. 如果右側的表達式又匹配失敗,則 “非貪婪部分” 將再增加匹配一次。再嘗試匹配 “右側的表達式”。
  4. 依此類推,最后得到的結果是 “非貪婪部分” 以盡可能少的匹配次數,使整個表達式匹配成功。或者最終仍然匹配失敗。

    當一個表達式中有多個非貪婪匹配,以表達式 “d(w+?)d(w+?)z” 為例,對于第一個括號中的 “w+?” 來說,右邊的 “d(w+?)z” 屬于它的 “右側的表達式”,對于第二個括號中的 “w+?” 來說,右邊的 “z” 屬于它的 “右側的表達式”。

    當 “z” 匹配失敗時,第二個 “w+?” 會 “增加匹配一次”,再嘗試匹配 “z”。如果第二個 “w+?” 無論怎樣 “增加匹配次數”,直至整篇文本結束,”z” 都不能匹配,那么表示 “d(w+?)z” 匹配失敗,也就是說第一個 “w+?” 的 “右側” 匹配失敗。此時,第一個 “w+?” 會增加匹配一次,然后再進行 “d(w+?)z” 的匹配。循環前面所講的過程,直至第一個 “w+?” 無論怎么 “增加匹配次數”,后邊的 “d(w+?)z” 都不能匹配時,整個表達式才宣告匹配失敗。

    其實,為了使整個表達式匹配成功,貪婪匹配也會適當的“讓出”已經匹配的字符。因此貪婪匹配也有類似的情況。當一個表達式中有較多的未知匹配次數的表達式時,為了讓整個表達式匹配成功,各個貪婪或非貪婪的表達式都要進行嘗試減少或增加匹配次數,由此容易形成一個大循環的嘗試,造成了很長的匹配時間。本文之所以稱之為“陷阱”,因為這種效率問題往往不易察覺。

    舉例:”d(w+?)d(w+?)d(w+?)z” 匹配 “ddddddddddd…” 時,將花費較長一段時間才能判斷出匹配失敗。

效率陷阱的避免:

    避免效率陷阱的原則是:避免“多重循環”的“嘗試匹配”。并不是說非貪婪匹配就是不好的,只是在運用非貪婪匹配的時候,需要注意避免過多“循環嘗試”的問題。

    情況一:對于只有一個非貪婪或者貪婪匹配的表達式來說,不存在效率陷阱。也就是說,要匹配類似 “<td> 內容 </td>” 這樣的文本,表達式 “<td>([^<]|<(?!/td>))*</td>” 和 “<td>((?!</td>).)*</td>” 和 “<td>.*?</td>” 的效率是完全相同的。

    情況二:如果一個表達式中有多個未知匹配次數的表達式,應防止進行不必要的嘗試匹配。

    比如,對表達式 “<script language='(.*?)’>(.*?)</script>” 來說,如果前面部分表達式在遇到 “<script language=’vbscript’>” 時匹配成功后,而后邊的 “(.*?)</script>” 卻匹配失敗,將導致第一個 “.*?” 增加匹配次數再嘗試。而對于表達式真正目的,讓第一個 “.*?” 增加匹配成“vbscript’>”是不對的,因此這種嘗試是不必要的嘗試。

    因此,對依靠邊界來識別的表達式,不要讓未知匹配次數的部分跨過它的邊界。前面的表達式中,第一個 “.*?” 應該改寫成 “[^’]*”。后邊那個 “.*?” 的右邊再沒有未知匹配次數的表達式,因此這個非貪婪匹配沒有效率陷阱。于是,這個匹配腳本塊的表達式,應該寫成:”<script language='([^’]*)’>(.*?)</script>” 更好。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
国产精品成久久久久| 亚洲欧美日韩综合国产aⅴ| 亚洲影视一区二区三区| 欧美日韩黑人| 女主播福利一区| 在线午夜精品| 亚洲h色精品| 成人日韩在线| 中文字幕系列一区| 蜜臀av在线播放一区二区三区| 日韩欧美1区| 国产亚洲一区二区三区不卡| 国产欧美日韩在线一区二区| 久久精品国产久精国产爱| 免费在线观看视频一区| 天堂网在线观看国产精品| 电影91久久久| 久久三级毛片| 欧美日韩国产在线一区| 水野朝阳av一区二区三区| 激情不卡一区二区三区视频在线| zzzwww在线看片免费| 成人片免费看| 欧美久久一区二区三区| 久久精品亚洲一区二区| 六月婷婷一区| 亚洲成人一区| 欧美中文日韩| 国产精品久久久久9999高清 | 婷婷综合社区| 99久久夜色精品国产亚洲1000部| 久久高清精品| 91精品丝袜国产高跟在线| 蜜桃一区二区三区在线观看| 午夜日韩福利| 国产精品66| 国产激情综合| 久久中文字幕二区| 欧美日韩视频一区二区三区| 国产精品多人| 国产伊人精品| 亚洲精品影视| 亚洲综合日韩| 国产精品毛片在线看| 国产精品试看| 亚洲欧洲免费| 久久精品九色| 欧美日韩三区| 久久久久97| 伊人久久婷婷| 国产免费久久| 日本久久成人网| 四虎精品一区二区免费| sm捆绑调教国产免费网站在线观看| 日韩亚洲在线| 精品色999| 伊人www22综合色| 亚洲啊v在线| 国产调教精品| 欧美91精品| 久久精品午夜| 亚洲欧洲国产精品一区| 成人福利av| 日韩免费精品| 日韩成人亚洲| 97精品国产99久久久久久免费| 在线中文字幕播放| 日韩精品福利一区二区三区| 久久久天天操| 国产精品一区亚洲| 国产精品嫩草99av在线| 精品一区视频| 亚洲精品少妇| 亚洲婷婷免费| 精品网站999| 日韩精品一区二区三区免费视频| 欧美亚洲国产精品久久| 国产经典一区| 日韩av成人高清| 久久福利毛片| 成人福利av| 麻豆一区在线| 国产亚洲电影| 日韩一区二区三区高清在线观看| 久久国产中文字幕| 激情不卡一区二区三区视频在线| 日本国产亚洲| 丝袜美腿一区二区三区| 日韩欧美网址| 精品三级av| 国产欧美日韩精品一区二区三区 | 日本国产精品| 大香伊人久久精品一区二区| 欧美一区成人| 午夜一级久久| 国产亚洲一区二区手机在线观看| 麻豆91精品视频| 日韩国产一区二| 在线免费观看亚洲| 欧美午夜不卡| 欧美日韩国产在线一区| 神马日本精品| 日韩久久视频| 91看片一区| av资源中文在线| 荡女精品导航| 精品国产欧美日韩| 麻豆传媒一区二区三区| 国产日韩在线观看视频| 亚洲婷婷丁香| 综合一区av| 综合干狼人综合首页| 老牛影视一区二区三区| 不卡在线一区二区| 久久中文字幕二区| 不卡视频在线| 亚洲欧洲一区二区天堂久久| av不卡免费看| 中文精品视频| 亚洲欧美日韩在线观看a三区| 亚洲制服少妇| 日av在线不卡| 亚洲美女久久| 久久精品99久久久| 国产欧美丝祙| 久久一区欧美| 91青青国产在线观看精品| 日本精品黄色| 99精品国产一区二区三区| 亚洲无线一线二线三线区别av| 亚洲电影在线一区二区三区| 香蕉视频成人在线观看| 蜜桃久久精品一区二区| 天堂久久av| 欧美成人精品午夜一区二区| 手机在线电影一区| 久久精品国语| 亚洲激情二区| 亚洲最新av| 日精品一区二区三区| 国产精品久久| 97精品中文字幕| 成人久久一区| 日韩一区亚洲二区| 亚洲激情婷婷| 日韩三级一区| 久久精品国产99国产精品| 91看片一区| 国产精品日本| 国产日韩欧美一区| 国产一区二区三区成人欧美日韩在线观看| 毛片在线网站| 日韩视频在线一区二区三区| 日本综合精品一区| 国产精品久久久久久久久免费高清| 成人午夜毛片| 1024精品一区二区三区| 免费成人在线视频观看| 国产精品一区二区三区www| 成人一区不卡| 亚洲主播在线| 久久av网址| 久久蜜桃精品| 日本成人在线视频网站| 国产精品99一区二区三区| 免费av一区二区三区四区| 亚洲18在线| 国产一区二区三区亚洲| 午夜欧美精品久久久久久久| 最新国产精品| 久久精品国内一区二区三区| 蜜桃一区二区三区| 欧美亚洲专区| 日本精品不卡| 日韩一区精品| 99久久久国产精品美女| 日韩精彩视频在线观看| 日韩欧美一区二区三区免费观看| 亚洲伊人精品酒店| 精品国产乱码久久久久久樱花| japanese国产精品| 国产精品一区亚洲| 亚洲国产成人精品女人| 国产精品igao视频网网址不卡日韩| 91亚洲国产| 亚洲久久在线| 国产v综合v| 欧美亚洲自偷自偷| 91精品成人| 国内自拍视频一区二区三区| 中文一区一区三区免费在线观 | 日本午夜免费一区二区| 偷拍精品精品一区二区三区| 日韩高清电影免费| 亚洲www啪成人一区二区| 婷婷亚洲成人| 蜜桃视频在线网站| 69堂免费精品视频在线播放| 欧美亚洲在线日韩| 久久爱www成人|