亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > regex > 正文

正則表達式話題

2020-01-20 22:28:20
字體:
來源:轉載
供稿:網友

From: www.regexlab.com

引言

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


1. 表達式的遞歸匹配

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

匹配未知層次的嵌套:

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

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

    [Perl 和 PHP 的示例代碼]

匹配有限層次的嵌套:

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

    第一步,寫一個不能支持嵌套的表達式:"/( [^()]* /)","

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

    匹配嵌套一層的 "<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]" 這樣的文本時,我們根據

    當發現

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

效率陷阱的產生:

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

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

  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" 都不能匹配時,整個表達式才宣告匹配失敗。

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

    舉例:,將花費較長一段時間才能判斷出匹配失敗。

效率陷阱的避免:

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

    情況一:對于只有一個非貪婪或者貪婪匹配的表達式來說,不存在效率陷阱。也就是說,要匹配類似 "<td> 內容 </td>" 這樣的文本,表達式 "

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

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

    因此,對依靠邊界來識別的表達式,不要讓<script language='([^']*)'>(.*?)</script>" 更好。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲a在线播放| 亚洲最大福利视频网| 韩国国内大量揄拍精品视频| 国产精品久久久久秋霞鲁丝| 国产欧美一区二区白浆黑人| 久久久久久久999| 97在线观看视频| 国产免费一区二区三区在线观看| 成人国产精品久久久久久亚洲| www.欧美视频| 热99精品里视频精品| 国产精品女人久久久久久| 国产精品视频大全| 亚洲福利视频专区| 国产成人精品视频在线观看| 中文国产亚洲喷潮| 国产亚洲精品久久久| 国产成人黄色av| 亚洲自拍另类欧美丝袜| 欧美放荡办公室videos4k| 欧美一性一乱一交一视频| 欧美性猛交xxx| 成人欧美一区二区三区黑人孕妇| 日本免费一区二区三区视频观看| 亚洲精品国产拍免费91在线| 美女久久久久久久久久久| 91在线观看免费| 精品视频在线导航| 7777精品久久久久久| 欧美一区视频在线| 日韩在线视频国产| 成人美女av在线直播| 欧美日韩不卡合集视频| 色悠久久久久综合先锋影音下载| 国自产精品手机在线观看视频| 亚洲综合中文字幕68页| 欧美日韩精品中文字幕| 欧美久久久精品| 78m国产成人精品视频| 日本一区二三区好的精华液| 亚洲片av在线| 日韩电影中文字幕| 久久久亚洲影院| 亚洲美女视频网站| 亚洲第一精品夜夜躁人人躁| 欧美精品第一页在线播放| 久久免费福利视频| 久久成人人人人精品欧| 久久久久成人精品| 亚洲护士老师的毛茸茸最新章节| 国产精品一区二区三区在线播放| 欧美一区二区大胆人体摄影专业网站| 亚洲精选在线观看| 日产精品久久久一区二区福利| 亚洲一区精品电影| 一区二区三区无码高清视频| 亚洲最新av网址| 亚洲福利视频久久| 亚洲美女又黄又爽在线观看| 欧美日韩一区二区在线| 日韩人体视频一二区| 亚洲男人的天堂在线播放| 欧美成人四级hd版| 一本色道久久88精品综合| 亚洲国产欧美日韩精品| 亚洲在线观看视频网站| 欧美视频免费在线观看| 久久久久久久成人| 成人免费观看49www在线观看| 亚洲综合中文字幕68页| 国产成人精品午夜| 九九久久久久久久久激情| 日韩欧美在线字幕| 久久久999精品免费| 亚洲视频欧美视频| 欧美日本啪啪无遮挡网站| 国产在线视频91| 深夜福利日韩在线看| 亚洲人成毛片在线播放| 中文字幕欧美日韩精品| 亚洲欧美www| 日韩在线观看免费全| 亚洲综合在线播放| 国产成人福利网站| 国产一区二区三区在线免费观看| 久久久久久久国产精品视频| 亚洲一级一级97网| 欧美高清第一页| 久久精品成人欧美大片古装| 欧美黄色片视频| 国产精品久久久久999| 欧美激情视频免费观看| 欧美电影院免费观看| 国产精品久久久亚洲| 黄色精品一区二区| 亚洲视频视频在线| 日韩风俗一区 二区| 国内精品久久久久影院 日本资源| 亚洲一区美女视频在线观看免费| 最近2019中文字幕mv免费看| 亚洲精品大尺度| 国产日产久久高清欧美一区| 欧美一区在线直播| 国产亚洲精品久久久久久777| 久久综合色影院| 日本免费一区二区三区视频观看| 97免费在线视频| 亚洲视频电影图片偷拍一区| 国产综合香蕉五月婷在线| www.日韩视频| 欧美一级大胆视频| 在线观看免费高清视频97| 精品国内产的精品视频在线观看| 91亚洲精品一区二区| 久久免费视频网站| 午夜精品福利电影| 2019亚洲男人天堂| 欧美精品午夜视频| 亚洲成人黄色在线观看| 亚洲国产精品va在线观看黑人| 日韩精品高清在线| 欧美精品日韩www.p站| 国产欧美精品一区二区三区介绍| 97精品视频在线| 日韩国产精品亚洲а∨天堂免| 久久国产精品免费视频| 91久久久久久久久久久久久| 精品一区二区三区四区在线| 亚洲国产另类 国产精品国产免费| 国产精品96久久久久久又黄又硬| 久久精品视频在线观看| 一区二区三区国产在线观看| 美女啪啪无遮挡免费久久网站| 日韩av123| 精品久久香蕉国产线看观看gif| 青青久久av北条麻妃黑人| 亚洲精品欧美一区二区三区| 欧美久久精品午夜青青大伊人| 韩国视频理论视频久久| 国产香蕉精品视频一区二区三区| 成人中文字幕在线观看| 久久免费精品日本久久中文字幕| 激情懂色av一区av二区av| 国产精品日韩专区| 国产精品视频久久| 91色视频在线导航| 欧美亚洲国产成人精品| 欧美亚洲另类激情另类| 欧美极品第一页| 亚洲国产中文字幕在线观看| 亚洲国语精品自产拍在线观看| 精品中文视频在线| 欧美成人网在线| 日韩欧美亚洲一二三区| 国产成人激情小视频| 欧美亚洲一级片| 日本精品视频在线播放| 亚洲大胆人体在线| 91爱视频在线| 精品久久久久久久久久久| 国产精品毛片a∨一区二区三区|国| 日韩中文字幕免费| 亚洲女人天堂色在线7777| 在线成人中文字幕|