正則表達式

正則表達式


1課程安排

目標:瞭解正則表達式的功能和使用場景,掌握基本正則書寫語法。


2正則表達式簡介

正則表達式是什麼

正則表達式本身就是一種語言,這在其它語言是通用的

正則表達式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。 

strpos(‘abc’);  //精確匹配   只能匹配字符串“abc”

正則表達式 //模糊匹配


在SQL中

Where name=’zhangsan’; //精確匹配

Where name like ‘zhang%’; //姓名以zhang開始的字符串


爲什麼使用(使用場景)

    1)驗證郵箱   [email protected]   [email protected]   [email protected]

    2)手機號     17002810530     15888888888     18777777777

    3)銀行卡號

    4)採集器

    5)中獎信息 138****8888

    6)屏蔽特殊詞彙


3入門

 20180207-1-zhengze-1.png


4常用的函數


preg_match()

preg_match_all()

preg_replace()

匹配模式

i忽略大小寫

x去除規則中的空白

U非貪婪

 

4幾個重要的概念

    1子表達式

在正則匹配模式中,使用一對括號括起來的內容是一個子表式

    2捕獲

在正則匹配模式中,子表達式匹配到的內容會被系統捕獲至系統的緩衝區中

    3反向引用

捕獲之後,可以在匹配模式中,使用\n (n:數字)來引用系統的第n號緩衝區內容

 20180207-1-zhengze-3.png


5練習

1對稱字符

匹配幾個字母后面三個數字接着是前面字母的重複,比如:abc123abc

/(\w+)\d\d\d\1/

(\w+)\d+\1


2連續數字

匹配連續四個數字,比如abcd9527fadsas

/\d\d\d\d/


3對稱數字

查找這樣的數字

1221

4334

/(\d)(\d)\2\1/


4成對字符

查找類似:

AABB

KKLL

/(\w)\1(\w)\2/


5相同字符

比如:

AAAA

4444

/(\w)\1\1\1/


6匹配出姓名:

my name is xxx。

i am 18 years old.


6語法細節

正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱爲元字符)組成的文字模式。正則表達式作爲一個模板,將某個字符模式與所搜索的字符串進行匹配。


正則表達式的構成:


    1)普通字符 :a b c d 1 2 3 4 ........

    2)特殊字符(元字符):\d \D \w . .......


我們在寫正則表達式的時候,需要確定這樣幾件事:


    1)我們要查什麼

    2)我們要從哪查

    3)我們要查多少


7限定符

限定符可以指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配。


    * 匹配前面的組件零次或多次

    + 匹配前面的組件一次或多次

    ? 匹配前面的組件零次或一次

    {n} 匹配確定的 n 次

    {n,} 至少匹配n 次

    {n,m}  最少匹配 n 次且最多匹配 m 次


也可以使用以下方式表示:


*             {0,}

+ {1,}

? {0,1}


8貪婪模式

如果在表達式的後面使用'?',表示非貪婪匹配原則,就會儘可能匹配少的,示例如下:

$reg = '/<.*?>/';
$str = '<span>1111</span><span>222</span>';
preg_match_all($reg, $str, $rst);
var_dump($rst);
array(1) {
  [0]=>
  array(4) {
    [0]=>
    string(6) "<span>"
    [1]=>
    string(7) "</span>"
    [2]=>
    string(6) "<span>"
    [3]=>
    string(7) "</span>"
  }
}



9字符匹配符

字符匹配符用於匹配某個或某些字符


1字符簇

[a-z] :表示a-z任意一個字符

[A-Z] :表示A-Z任意一個字符

[0-9]   :表示0-9任意一個數字

[0-9a-z] :表示0-9 a-z任意一個字符

[0-9a-zA-Z] :表示0-9 a-z A-Z任意一個字符

[abcd] :表示a 或b 或c 或 d

[1234] :表示 1 或2 或3 或 4

[^a-z] :表示匹配除了a-z之間任意一個字符

[^0-9] :表示匹配除了0-9之間任意一個字符

[^abcd] :表示匹配除a b c d 之外的任意一個字符

\d :匹配一個數字字符。[0-9]

\D :匹配一個非數字字符。[^0-9]

\w :匹配包括下劃線的任何單詞字符。[0-9a-zA-Z_]

\W :匹配任何非單詞字符。[^\w]

\s :匹配任何空白字符   空格、製表符、換行符

\S :匹配任何非空白字符。 

.  :匹配除 "\n" 之外的任何單個字符   如果想匹配任意字符 [.\n]


2定位符

定位符可以將一個正則表達式固定在一行的開始或結束。也可以創建只在單詞內或只在單詞的開始或結尾處出現的正則表達式。 


匹配輸入字符串的開始位置

匹配輸入字符串的結束位置

\b  匹配一個單詞邊界

\B  匹配非單詞邊界


3轉義符

\ 用於匹配某些特殊字符

需要轉義的字符有:

(

)

[

]

{

}

\

.

/

*

+

?

^

$


4選擇匹配符

可以匹配多個規則,|兩邊各是一個選項


$str = 'hello,world,hello,php';

$reg = '/hello,world|php/';//hello,worldphp

$reg = '/hello,(world|php)/';hello,worldhello,php


5表達式的分界符

表達式必須用分隔符閉合, 比如一個正斜槓(/). 分隔符可以使任意非字母、數字、反斜槓(\)和空字節之外的非空白ascii字符. 如果分隔符 在表達式中使用, 需要使用反斜線進行轉義. 自php 4.0.4開始, 可以使用perl樣式的(), {}, []以及<>作爲分隔符. 


練習:

郵箱地址

用戶名可以是字母數字下劃線

域名必須有點,最後一段不能帶有數字


[email protected]

[email protected] 不合法的

admin@cc 不合法的

[email protected]合法的


用戶名部分:字母數字下劃線

\w+

@

域名部分

\w+\.[a-z]+


參考答案:\w+@(\w+\.)+[a-z]+


匹配IP地址

0-255第一段不能是0

[1-9]

[1-9][0-9]

1[0-9][0-9]

2[0-4][0-9]

25[0-5]


第二段:

[0-9]

[1-9][0-9]

1[0-9][0-9]

2[0-4][0-9]

25[0-5]

第三段和第二段一樣


關於正則表達式的幾種特殊用法

20180207-1-zhengze-4.png

轉載自:http://www.codexueyuan.com/learn/learn-detail187


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章