11.一個正規表示式案例讓你馬上明白貪婪匹配與禁止貪婪! 超級實用!
作者: 極客小俊
PHP正規表示式_貪婪匹配與懶惰匹配 (禁止貪婪)
什麼是貪婪匹配呢?
廢話不多說 先看一段程式碼案例把 如下:
$string='aaaaaaabbbbbbbbbbbbccccccc';
//如下
$pattern='/ab+/';
//或者說是如下
$pattern='/ab.+/';
preg_match($pattern, $string,$arr);
show($arr);
php正規表示式預設就是貪婪的 解決貪婪匹配 的辦法就是用 ? 號
所以阻止貪婪一般加? 來解決
程式碼如下:
$string='aaaaaaabbbbbbbbbbbbccccccc';
//如下
$pattern='/ab+?/';
//或者說是如下
$pattern='/ab.+?/';
preg_match($pattern, $string,$arr);
show($arr);
小案例1:
這裡跟加不加s 視為單行字元有關係, 因為加了s 視為單行以後會產生貪婪匹配、所以阻止貪婪後 在進行全域性搜尋匹配!
程式碼如下:
$string='test test test test
test test test ';
//匹配網址
$pattern='/http://(ftp|www).w+.(com|org|net)/';
//匹配href的內容 這裡不加? 就會出現貪婪匹配
$pattern='/href="(.+?)"/s';
preg_match_all($pattern, $string,$arr);
show($arr);
小案例2:
刪除某一個class檔案中的所有註釋 例如:Car.class.php檔案
內容如下:
/**
* @description
* @author 3#
*/
interface Car{
function run();
}
/**
*
* @description 寶馬車類
*
*/
class Bmw implements Car{
public function run(){
echo '寶馬車子在跑!!';
}
}
/**
* @description 賓士車類
*
*/
class Bz implements Car{
public function run(){
echo '賓士車子在跑!!';
}
}
// $Bmw=new Bmw();
// $Bmw->run();
// echo '
';
// $Bz=new Bz();
// $Bz->run();
?>?php>
然後處理這個Car.class.php中的註釋,把裡面的註釋都刪掉
通常我們是如下處理的
//載入檔案
$file='./Car.class.php';
$content=file_get_contents($file);
//正則匹配
$pattern='//**.**//s';
//替換為空
$result=preg_replace($pattern, '', $content);
//最後把處理好的字元重新寫入帶檔案中
file_put_contents($file, $result);
以上這樣處理看似沒什麼問題,但是當你開啟Car.class.php這個檔案的時候你要大吃一驚的!! 現在Car.class.php裡面應該只剩下 下面這個類了 其他的都不見了!!
class Bz implements Car{
public function run(){
echo '賓士車子在跑!!';
}
}
原因:如果這樣替換會產生如下情況: 原因是;貪婪匹配 .* 匹配了/* 開始一直到 /結尾、 中間無論什麼內容都被視為 . 的範疇之內了!
正確的做法是加上? 號 阻止貪婪匹配
程式碼如下:
//載入檔案
$file='./Car.class.php';
$content=file_get_contents($file);
//正則匹配 並且禁止貪婪
$pattern='//**.*?*//s';
//替換為空
$result=preg_replace($pattern, '', $content);
//最後把處理好的字元重新寫入帶檔案中
file_put_contents($file, $result);
結果Car.class.php檔案中的註釋就全部刪除了 ,Car.class.php檔案中的程式碼如下:
interface Car{
function run();
}
class Bmw implements Car{
public function run(){
echo '寶馬車子在跑!!';
}
}
class Bz implements Car{
public function run(){
echo '賓士車子在跑!!';
}
}
小案例3:
查詢a出現1次到5次, 也包含之間的, 這種預設也是貪婪的,因為它會取出最大匹配的那一次! 也就是5次
如下程式碼:
$string='cbaaaaaa';
$pattern='/ba{1,5}/is';
preg_match($pattern, $string,$arr);
show($arr);
加上 ? 號 以後 就可以阻止貪婪匹配 並且取出最小匹配次數
如下程式碼:
$string='cbaaaaaa';
$pattern='/ba{1,5}?/is';
preg_match($pattern, $string,$arr);
show($arr);
小提示: ??兩個 問號就是完全取最小的
一個? 號表示取 0或者 1
兩個?號就表示禁止貪婪 取完全最小值0,
例如:案例中一個?號表示還是取了1個a ,但是兩個??問號就一定沒有a了 因為兩個?? 號表示0、等同於這樣寫: /ba{0}/
程式碼如下:
$string='cbaaaaaa';
$pattern='/ba??/is';
preg_match($pattern, $string,$arr);
show($arr);
"點贊" "評論" "收藏"
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/756/viewspace-2797552/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 正規表示式:貪婪模式與非貪婪模式模式
- 正規表示式 貪婪模式模式
- 非貪婪匹配
- Java 正規表示式匹配模式(貪婪型、勉強型、佔有型)Java模式
- Python 正則是否存在前向貪婪匹配呢?Python
- Python RE庫的貪婪匹配和最小匹配Python
- JAVA 正規表示式的三種模式: 貪婪, 勉強和佔有的討論Java模式
- 正則捕獲的懶惰性和貪婪性
- 貪婪演算法回顧演算法
- 貪心演算法(貪婪演算法,greedy algorithm)演算法Go
- Epic 大戰谷歌蘋果,未必只因貪婪谷歌蘋果
- 演算法(六):圖解貪婪演算法演算法圖解
- FreeSql 新功能介紹:貪婪載入五種方法SQL
- 匹配二級域名正規表示式
- 正規表示式匹配
- 即時通訊產品的一點小思考,貪婪的代價
- 《貪婪之秋》:一個小團隊針對經典美式RPG的文藝復興
- 《貪婪之秋》銷量破百萬 官方將推出次時代版本
- 20個實用正規表示式
- python 正規表示式匹配Python
- 正規表示式 多行匹配
- 匹配字母正規表示式
- leetcode - 正規表示式匹配LeetCode
- 正規表示式匹配原理
- 字串——正規表示式匹配字串
- 【GreatSQL最佳化器-04】貪婪搜尋演算法淺析SQL演算法
- 匹配正整數正規表示式
- 正規表示式(匹配第一個花括號)
- 正規表示式匹配漢字
- 正規表示式匹配問題
- 匹配護照正規表示式
- 匹配小數正規表示式
- 匹配負數正規表示式
- 匹配整數正規表示式
- 匹配自然數正規表示式
- 匹配航班號正規表示式
- 正規表示式支配匹配模式模式
- JavaScript匹配中文正規表示式JavaScript