程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL 取得以後日期時光的函數小結

MySQL 取得以後日期時光的函數小結

編輯:MySQL綜合教程

MySQL 取得以後日期時光的函數小結。本站提示廣大學習愛好者:(MySQL 取得以後日期時光的函數小結)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL 取得以後日期時光的函數小結正文


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>" 更好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved