正規表示式.

湯清麗發表於2019-11-10

第1章 認識正則

所謂正則,其實就是字串規則表示式,比如說大家熟悉的"*"代表的是所有字元.其實不應該叫正規表示式,你叫它規則表示式更好,因為它的主要作用就是,透過規則,找出你想要找的東西。

1.描述你要找的字串的規律。
2.呼叫函式,執行該正規表示式。

1.php

//把字串的'hi'找出來
//規律:'hi'
$str = 'hi,this is his history';
$patt = '/hi/';
preg_match_all($patt,$str,$res);
print_r($res);

程式設計師都會用到,但是平常用的不多,所以容易忘。

入手:找誰?怎麼找?找幾個?

  • 具體字元(字面值) --> 比如說就找a,b,hi
  • 字元邊界(下面加粗) --> 從哪開始到哪結束
  • 字符集合[ace],[0123456789] --> 裡面任意條件符合找出來
  • 字元補集[^ qxz]:不在qxz範圍內 --> 裡面任意條件符合的不要
  • 字元範圍[a-z0-9] --> 注意:必須是連續的,你不能寫a-Z
  • 字元簇(系統定義好的常用集合,在第二章) --> 系統定義好的常用集合

字元邊界

  • ^ 匹配字串的開始
  • $ 匹配字串的結尾
  • \b 匹配單詞的開始和結尾(邊界)
  • \B 匹配單詞的非邊界

第2章 常用字元簇

代表
.(點) 任意字元,不含換行
\w [a-zA-Z0-9 _]
\W \W的補集
\s 空白符,包括\n\r\t\v等
\S 非空白符
\d [0-9]
\D 非數字

第3章 單詞匹配

// 把字串的hi單詞找出來
// 規律,單詞開始處=>hi=>單詞結束處 \b
$str = 'hi , this is some history book';
$patt = '/\bhi\b/';
preg_match_all($patt,$str,$res);
print_r($res);

//把包括在單詞內部的hi找出來
$patt = '/\Bhi\B/';
$str = ''

第4章 集合與補集示例

/*
給定一組手機號,必須由[0123456789]組成的,才選出來從哪找?從字串的開始找,找到字串的結束 ^ $ 
找誰[01235689]
找幾個?11個
*/
$arr = array('13800138000','13487656887','434456','45454353434543');
//$patt = '/^[^47]{11}$/'; //補集方法
$patt = '/^[01235689]{11}$/';//集合方式
foreach($arr as $v){
    preg_match_all($patt,$v,$res);
    print_r($res);
}

第5章 字元範圍

//試著找純字母組成的單詞
$str = 'o2o, b2b,hello,wordl, that';
//$patt = '/\[a-zA-Z]{1,}\b'; //{1,}最少1個字母
$patt = '/\b[a-zA-Z]+\b/';
preg_match_all($patt,$str,$res);
print_r($res);

第6章 字元簇

就是系統規定好的標識方法

$str = 'tommorw is another day,o2o ,you dont bird me i dont bird you';
$patt = '/\W{1,}';// \w \w[a-zA-Z0-9_]的補集
//preg_split 透過正則的表示式,分割字串
print_r(preg_split($patt,$str));

//把多個空格或者製表符換成一個空格
$str = 'a     b     hello         world';//'a b hello world';
$patt = '/\s{1,}/'; //\s空白符,包括 \n\r\t\v 等
//preg_replace - 執行一個正規表示式的搜尋和替換
echo preg_replace($patt,' ',$str);

第7章 找幾個

  • *匹配前面的子表示式零次或多次。
  • +匹配前面的子表示式一次或多次。
  • \? 匹配前面的子表示式零次或一次。
  • {n} n是一個非負整數。匹配確定的 n 次。
    {n,m} m和 n均為非負整數,其中n <= m
  • 最少匹配 n 次且最多匹配 m 次。。
  • {n,} n 是一個非負整數。至少匹配n 次。
$str = 'longren lao wang meng ge bi ';
// 5個字母組成的單詞
//$patt = '/\b[a-zA-Z]{5}\b/';

// 3-5個字母組成的單詞
//$patt = '/\b[a-zA-Z]{3,5}\b/';

// 5個以上字母組成的單詞
//$patt = '/\b[a-zA-Z]{5,}\b/';

preg_match_all($patt, $str, $res);
print_r($res);
/*
某編輯部,鍵盤壞了,0鍵彈不出來,經常打出多個0
於是god打成good,gooood,請把這些單詞替換成god
*/
$s = 'goooood,goood,goooooooooood';
$p = '/go+d/';
print_r(preg_replace($p,'god',$s));

第8章 或者的用法

//查詢純數字或者純字母的詞
$str = 'hello o2o 2b9 250';
$patt = '/\b[a-zA-Z]+\b|\b[0-9]+\b/';//最少一個
preg_match_all($patt,$str,$res);
print_r($res);

//查詢蘋果系統的產品
$str = 'ipad,iphone,imac,ipod,iamsorry';
$patt = '/\bi(pad|phone|mac|pod)\b/';
preg_match_all($patt,$str,$res);
print_r($res);

第9章 貪婪與非貪婪

$str = 'ksda good goooood good kl s ja dfs dk ';
//把g(任意多的內容)d 這樣的字串,換成god
$patt = '/g.+d/'; //預設貪婪模式(會盡量多匹配)
preg_match_all($patt,$str,$res);
print_r($res); //god is not good

$patt = '/g.+?d/'; //在數量(+ * {n,})限定符後,加?,非貪婪模式
preg_match_all($patt,$str,$res);
print_r($res); //god,good

第10章 採集手機號

$str = '湯小姐,聯絡手機號:18611015252,備用電話:18828821111,QQ:381413622,email:381413622@qq.com,,身份證號:430426199901013478';\
//採集電話號碼\
$patt = '/\b1[358]\d{9}\b/';\
preg_match_all($patt,$str,$res);\
print_r($res);

第11章 後向引用

找收尾字母相同的單詞

$str = 'txt hello,high,bom,mum';
//簡化,先找到首尾字母都是t的
$patt = '/\bt\w+t\b/';
preg_match_all($patt,$str,$res);
print_r($res);

此方法重複26次,也能找到

//第n個小括號內的子表示式,命中的內容,後面就用\n來引用
//後向引用
$patt = '/\b([a-z])\w+\1\b/';
//1.單詞開始和結束 \b\b
//2.開始的[a-z]都可以.\b[a-z]\b
//3.後面跟什麼都行,不管.並且字數不限 \b[a-z]\w+\b
//4.最後一個應該和第一個相同.\b([a-z])\w+\b 子表示式,放在下面另一個陣列裡面,最後一個引用子表示式匹配出來的結果\b([a-z])\w+\1\b
preg_match_all($patt,$str,$res);
print_r($res);

把手機號中間的4位替換為*

$str = '13800138000 , 13426060134 ';
//前3位和後4位放子表示式中,中間4位隨便,保留子表示式.替換中間的4位
$patt = '/(\d{3})\d{4}(\d{4})/';
//preg_match_all($patt, $str, $res);
//print_r($res);
echo preg_replace($patt, '\1****\2', $str);

第12章 模式

模式修飾符,可以一定程度上影響正則的解析行為
比如i, 就代表正則不區分大小寫, /[a-z A-Z ]+/ --->/[a-z ]+/i
比如s, 單行模式, 就代表把整個檔案看成一個"單行",忽略回車

$str = 'hello WORLD  ChINa';
//$patt = '/\b[a-z]+\b/'; //hello
$patt = '/\b[a-z]+\b/i'; // 忽略大小寫
preg_match_all($patt, $str, $matches);
print_r($matches);

$str = "abc haha
abc dgh";
$patt = '/.+/s'; # single 單行模式,將所有內容看成一整行
preg_match_all($patt, $str, $matches);
print_r($matches);
//U 模式,把傳入的引數看成unicode字符集的編碼,可以判斷中文
// http://blog.sina.com.cn/s/blog_640937d101017pca.html
// PHP下正則匹配中文,u模式,\x{4e00}-\x{9fa5}

$str = 'bob李';
$patt = '/^[\x{4e00}-\x{9fa5}]+$/u';
echo preg_match($patt,$str)?'國貨':'雜貨';
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章