html' target='_blank'>正則表達式語言由兩種基本字符類型組成:原義(正常)文本字符和元字符。
元字符使用正則表達式具有處理能力。元字符既可以是放在[ ]
中的任意單個字符(如 [a]
表示匹配單個小寫字符 a
),也可以是字符序列(如 [a-d]
表示匹配 a 、b、 c、 d
之間的任意一個字符,而 /w
表示任意英文字母和數字及下劃線),常見的元字符如下:
字符 | 描述 | 特別說明 | . | 匹配除換行符(/n )以外的任意字符 | ~ | [abcde] | 匹配 a b c d e 之中的任意一個字符 | 所有字符是 或 的關系 | [a-h] | 匹配 a 到h 之間的任意一個字符 | ~ | [^fgh] | 不與 fgh 之中的任意一個字符匹配 | 在 中括號[ ] 的第一個字符前加上 ^ 表示 取反 不匹配中括號里面出現的任意字符 | /w | 匹配大小寫英文字符及數字 0 到 9 之間的任意一個及下劃線,相當于[a-zA-Z0-9_] | ~ | /W | 與 /w 相反,相當于 [^a-zA-Z0-9_] | ~ | /s | 匹配任意的空白符,相當于 [/f/n/r/t/v] | ~ | /S | 與 /s 相反,相當于 [^/s] | ~ | /d | 匹配任何 0 到 9 之間的單個數字,相當于 [0-9] | ~ | /D | 與 /d 相反,相當于[^0-9] | ~ | [/u4e00-/u9fa5] | 匹配任意單個漢字(中文)(這里用的是 Unicode 編碼表示的漢字) | ~ | /b | 匹配單詞的開始或結束 | ~ | ^ | 匹配字符串的開始 | 放在中括號的第一個字符前 則變為 取反的意思 | $ | 匹配字符串的結束 | ~ |
---|
作用:限定這個符號前面 一個 單元 多出現的次數
單元:
上面的元字符都是針對單個字符匹配的,要想同時匹配多個字符的話,還需要借助限定符,下面是一些常見的限定符(下表中 n
和 m 都是表示 整數。)
字符 | 描述 | 特別說明 | * | 匹配 0 到 多 個元字符,相當于 {0,} | ~ | ? | 匹配 0 到 1 個元字符, 相當于 {0,1} | ~ | + | 匹配至少 1 個元字符,相當于 {1,} | ~ | {n} | 匹配 n 個元字符 | ~ | {n,} | 匹配至少 n 個元字符 | ~ | {n,m} | 匹配 n 到 m 個元字符 | ~ | /b | 匹配單詞邊界 | ~ | ^ | 字符串必須以指定的字符開始 | ~ | $ | 字符串必須以指定的字符結束 | ~ |
---|
分組
,比如 ^(13)[4-9]/d{8}$
表示任意以 13 開頭的移動手機號碼。abcabcabc+
表示 最后的字母 c
出現 1 次或 多次;(abcabcabc)+
表示 整個字符串 abcabcabc
出現 1 次或 多次。|
來表示 或
的關系,例如 z|j|q
表示匹配 z 、j、q
之中的任意一個字母。其實等價于 [zjq]
。ab|cd|ef
表示的是:要么是 ab
、要么是 cd
要么是 ef
。a(b|cd|e)f
表示的是:以a
開頭,要么是 b
、要么是 cd
要么是 e
,最后以f
結尾。|
(或
) 的唯一邊界是 小括號(( )
)[0-9A-Z.?]
這個正則你如何理解?.
和 ?
出現在中括號中時,.
和 ?
將變為 普通字符,它就是 點 和 問號。你可以理解為 [ ]
的優先級要大于. 和 ?
的優先級。?aaa.bbb
,記住這里 . 和 ?
被完全當做了普通字符。多選結構其實就是元字符 |
(或)的使用。
界定范圍:開頭、結尾、小括號
正則 | 含義 | Windows98|Windows2000|WindowsXP | 匹配Windows98 或者Windows2000 或者WindowsXP | ^Windows98|Windows2000|WindowsXP$ | 以Windows98 開頭或者包含Windows2000 或者以WindowsXP結尾 注意 ^ 和$ 都包含在| 的范圍內,因為| 的界限只有:開頭、結尾、小括號 | Windows(98|2000|XP) | Windows 然后98 或者2000 或者XP |
---|
總結:多選結構可以包括很多字符,但不能超越 括號
的界限。
(/d{1,3}/.){3}/d{1,3}
簡單的 IP 地址匹配表達式((2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5]|[01]?/d/d?)
左括號
為標志,從左向右,第一個分組的組號為 1 ,第二個為 2 ,依次類推。示例:
/b(/w+)/b/s+/1/b
可以用來匹配重復的單詞where where go, tom tom happy
直白解釋:
正則表達式中,前面用小括號進行劃分(分組),后面把小括號匹配到的內容引用到后面來,分別用/1
、/2
等 來表示。(第一個小括號極/1
...)。如果存在 小括號嵌套小括號的情況 (/w+(.?))
記住:這個時候要以 (
為標志 從左往右 數小括號就可以了。
/b
、^
、$
那樣。環視不會占用字符。(?=exp)
位置的后面能匹配 exp
。例如:(?=/d)
當前位置右邊是數字。(?!exp)
位置的后面不能匹配 exp
。例如:(?!/d)
當前位置右邊不是數字。(?<=exp)
位置的前面能匹配 exp
。例如:(?<=/d)
當前位置左邊是數字(?<!exp)
位置的前面不能匹配 exp
。例如:(?!/d)
當前位置左邊不是數字。+
、*
、{3,12}
等)時, 通常的行為是匹配盡可能多的字符。a.*b
,它將會匹配最長的以 a
開始,以 b
結束的字符串。如果用它來搜索 aabab
的話,它會匹配整個字符串 aabab
,這被稱為 -------貪婪匹配?
。這樣 .*?
就意味著匹配任意數量的重復,但是在能使整個 匹配成功的前提下使用最少的重復。a.*?b
匹配最短的,以 a
開始, 以 b
結束的字符串。如果把它應用于 aabab
的話,它會匹配 aab
和 ab
。總結:
高級5 - 模式匹配的優先級貪婪與懶惰模式之間的區別就在于:懶惰模式 在量詞
*
的后面多了一個 問號?
。
在使用正則表達式時,需要注意匹配的順序。通常相同優先級 從左到右 進行計算,不同優先級的運算 先高后低。各種操作符的匹配順序優先級 從高到低 如下表所示。
順序 | 元字符 | 描述 | 1 | / | 轉義字符 | 2 | () 、(?:) 、(?=) 、[] | 模式單元和原子表 | 3 | * 、+ 、? 、{n} 、{n,} 、{n,m} | 重復匹配 | 4 | ^ 、$ 、/b 、/B 、/A 、/Z | 邊界限制 | 5 | | | 模式選擇 |
---|
1問:要匹配字符串 333333/$33/33333
中的 /$
正則應該怎么寫?
2問:如果在 PHP 中 preg_match
函數分別用單引號和雙引號的表達式來匹配上面的 /$
,怎么寫?
答案:
///$
'///////$/'
。(為方便查看我們拆分一下為 '/// // // $/'
)"////////$/"
。(為方便查看我們拆分一下為 "/// // // /$/"
)再答:
/
,所以我們需要 6個/
來生成表達式。雙引號除了轉義 /
以外,還需要多一個 /
用來轉義 $
所以它 需要 7 個/
。
相關教程推薦:PHP視頻教程
以上就是詳解正則表達式的詳細內容,更多請關注 其它相關文章!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答