萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> 正則表達式(.+?)與(.*)區別

正則表達式(.+?)與(.*)區別

昨天碰到的問題,在BBs問了得出的答應如下./(.+?)b/is 是非貪婪模式 匹配ab /(.*)b/is 是貪婪模式 匹配abb,

昨天碰到的問題,在BBs問了得出的答應如下./(.+?)b/is  是非貪婪模式 匹配ab /(.*)b/is 是貪婪模式 匹配abb,

那麼我們來看看基本的符號說明:

*                                0次、1次或多次匹配其前的原子
+                                1次或多次匹配其前的原子
?                                0次或1次匹配其前的原子
.                                匹配除換行之外的任何一個字符

再看看簡單的例子:

你測試.+?和.*當然看不出區別了
測試這個字符串看看
'aaa<div style="font-color:red;">123456</div>bbb'
<.+?>會匹配<div style="font-color:red;">和</div>
<.*>會匹配<div style="font-color:red;">123456</div>

最後看看高手怎麼說的.

(.+)默認這是貪婪匹配
貪婪是先看整個字符串是否匹配, 如果不匹配,它會去掉字符串的最後一個字符, 並再次嘗式, 如果還不匹配, 那麼再去掉當前最後一個, 直到發現匹配或不剩任何字符.
過程大概這樣:
$str='abcdabceba'
/.+b/  // 匹配一個或多個任意字符後面跟一個字母 b

第一次(先看整個字符串是否是一個匹配) abcdabceba 不匹配,然後去掉最後一個字符 a
第二次(去掉最後一個字符後再匹配) abcdabceb  正確退出

惰性是從左側第一個字符開始向右匹配, 先看第一個字符是不是一個匹配, 如果不匹配就加入下一個字符再嘗式匹配, 直到發現匹配...
過程大概這樣
$str='abcdabceba'
/.+?b/ // 同樣匹配一個或多個任意字符後面跟一個字母 b

第一次(讀入左側第一個字符) a 不匹配加一個再式
第二次 ab  匹配記錄下來,繼續(如果匹配所有的話,比如 preg_match_all, 或preg_replace, 不是所有到這兒就停了
第三次 c
...
cdab  匹配記錄下來,繼續
...
ceb  匹配記錄下來,繼續

a 到最後了沒有了退出


簡單例子:
<?php
//這裡因為沒有用all, .+?只匹配一次

        
$str='abcdabceba';
        
preg_match('/.+b/', $str, $s);
        echo
$s[0]; // abcdabceb
        
        
echo"   ";
        
preg_Match('/.+?b/', $str, $s);
        echo
$s[0]; // ab
        
        
echo"   ";
        
preg_Match('/.+b/U', $str, $s); //等同於 /.+?b/
        
echo $s[0]; //ab
?>

copyright © 萬盛學電腦網 all rights reserved