正規表示式之零寬斷言例項詳解【基於PHP】
本文例項講述了正規表示式之零寬斷言。分享給大家供大家參考,具體如下:
前言
之前我曾寫了一篇關於正規表示式的文章( ) 在該文章中詳細介紹了正則,但是關於零寬斷言介紹卻是很少提及到。現在將該內容補充一下。在本文中,主要解決如下問題:
① 什麼是零寬斷言,為什麼要使用零寬斷言
② 怎樣使用零寬斷言
概念
零寬斷言,大多地方這樣定義它,用於查詢在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像 \b ^ $ \< > 這樣的錨定作用,用於指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。我的理解是在一個限定位置的字串之前或之後進行匹配查詢。所以零寬斷言,執行過程分兩種情況,如果是正向斷言,應該是這樣的,第一步,判斷判斷斷言是否為真(即是否滿足一定條件)第二步,如果滿足條件,則進行下一步查詢匹配。如果是反向斷言,第一步還是按照正規表示式順序去匹配。第二步,遇到反向代言,判斷是否滿足反之代言。
正先行斷言
什麼是正先行斷言,就是在字串相應位置之前進行查詢匹配,使用 (?=exp) 匹配exp前面的位置。
例項
$str="abcgwcab"; $parent='/bc(?=gw)/'; $str=preg_match($parent,$str,$match); var_dump($match); /** 輸出結果: int 1 array (size=1) 0 => string 'bc' (length=2) */
解析:首先查詢字串”abcgwcab”中gw位置,斷言為真,然後在匹配bc。如果將正規表示式寫成$parent='/bc(?=gw)ca/'; 將會匹配不成功。
反先行斷言
什麼是反先行斷言,使用 (?!exp) 匹配後面跟的不是exp。
例項:
$str="abcgwcab"; $parent='/bc(?!ww)gw/'; $str=preg_match($parent,$str,$match); var_dump($str); var_dump($match); /** 輸出: int 1 array (size=1) 0 => string 'bcgw' (length=4) */
解析:首先判斷字串是否包含bc,然後判斷其後面不是ww,最後匹配gw。可以看出反向斷言之前後之後,能夠在新增其他匹配條件。
正後發斷言
什麼是正後發斷言,就是在字串相應位置之後進行查詢匹配, (?<=exp) 匹配exp後面的位置
例項:
$str="abcgwcab"; $parent='/(?<=gw)ca/'; $str=preg_match($parent,$str,$match); var_dump($str); var_dump($match); /** 輸出結果: int 1 array (size=1) 0 => string 'ca' (length=2) */
解析:第一步,查詢字元”abcgwcab”中是否包含有gw,返回結果為true,然後進行第二步,查詢gw後面是否有ca。
反後發斷言
什麼是反後發斷言,使用(?
$str="abcgwcab"; $parent='/(?<!bc)gw/'; $str=preg_match($parent,$str,$match); var_dump($str); var_dump($match); /** int 0 array (size=0) empty */
解析:首先在字串中匹配gw,然後判斷其前面是不是bc,發現其前面是bc,故返回false。
練習題
例1:
\d+(?=abc)
判斷一個字串中是否包含'abc',且其前面是否包含一個或多個數字
例2:
(?<=\d\d)\w
判斷字串中是否存在連續兩個數字,且其後麵包含一個字母
例3:
\d{3} (?!55)
判斷字串中是否包含連續三個數字,且三個數字後面不是55
例4:
(?<!ac)\w\d
判斷一個字串是否包含一個字母加數字的組合,且其前面不是ac
總結
先行斷言與後發斷言區別?
先行斷言是判斷斷言之前的正規表示式,斷言在其他正規表示式之後。後發斷言是判斷斷言之前的正規表示式,斷言在其他正規表示式之前。這裡的先與後,是其他匹配相對應斷言在正規表示式中的順序。
PS:這裡再為大家提供2款非常方便的正規表示式工具供大家參考使用:
JavaScript正規表示式線上測試工具:
正規表示式線上生成工具:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70015105/viewspace-2870878/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 正規表示式分組例項詳解
- 例項程式碼詳解正規表示式匹配換行
- 正規表示式例項蒐集,通過例項來學習正規表示式。
- JS之正規表示式詳解JS
- java正規表示式例項Java
- PHP preg match正規表示式函式的操作例項PHP函式
- PHP基礎系列之正規表示式(一)PHP
- JavaScript正規表示式校驗非零的正整數例項JavaScript
- Java 正規表示式例項操作Java
- js正規表示式例項(整理)JS
- 詳解正規表示式
- 正規表示式詳解
- PHP正規表示式模式修飾符詳解PHP模式
- JS基礎篇–正規表示式詳解JS
- 正規表示式子表示式程式碼例項
- 正規表示式?:用法詳解
- Java 正規表示式詳解Java
- grep正規表示式詳解
- php –正規表示式PHP
- PHP正規表示式PHP
- 通過js正規表示式例項學習正規表示式基本語法JS
- Python3之正規表示式詳解Python
- php之正規表示式函式總結PHP函式
- 匹配中文正規表示式程式碼例項
- 正規表示式分組詳解
- 詳解 Python 正規表示式Python
- MySQL-正規表示式詳解MySql
- Python正規表示式詳解Python
- Linux正規表示式詳解Linux
- Javascript正規表示式詳解(一)JavaScript
- JS正規表示式使用詳解JS
- 正規表示式使用詳解(轉)
- 前端基礎之正規表示式前端
- javascript正則--零寬斷言--案例解析JavaScript
- JavaScript正規表示式校驗非正整數例項JavaScript
- 驗證正整數正規表示式程式碼例項
- JavaScript正規表示式備忘單附例項JavaScript
- 解析url地址正規表示式程式碼例項