什麼叫正則表達式
正則表達式是對字符串進行操作的一種邏輯公式
用一些特定的字符組合成一個規則字符串,稱之爲正則匹配模式。
PHP中使用PCRE庫函數進行正則匹配,PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 兼容的正則表達式庫。
PHP 正則表達式:http://www.imooc.com/learn/350
javascript 正則表達式:http://www.imooc.com/learn/706
Python 正則表達式:http://www.imooc.com/learn/550
PCRE 庫函數 link
preg,代表“Perl的正則表達式(Perl Regular Expressions)”。
PHP中,ereg 已經逐漸被 preg 替代了
PCRE 庫函數 | 作用 |
---|---|
preg_match | 執行匹配正則表達式,常用來判斷一類字符模式是否存在。preg_match( |
preg_match_all | 執行一個全局正則表達式匹配,可以循環獲取一個列表的匹配結果數組 |
preg_filter | 執行一個正則表達式搜索和替換 |
preg_grep | 返回匹配模式的數組條目 |
preg_last_error | 返回最後一個PCRE正則執行產生的錯誤代碼 |
preg_quote | 轉義正則表達式字符 |
preg_replace_callback_array | Perform a regular expression search and replace using callbacks |
preg_replace_callback | 執行一個正則表達式搜索並且使用一個回調進行替換 |
preg_replace | 執行一個正則表達式的搜索和替換,preg_replace( |
preg_split | 通過一個正則表達式分隔字符串 |
基本語法
PCRE庫函數中,正則匹配模式使用分隔符與元字符組成
分隔符可以是非數字、非反斜線、非空格的任意字符。經常使用的分隔符是正斜線(/)、hash符號(#) 以及取反符號(~) (這裏比JS正則規則寬鬆?)
/^[0-9]$/
#^[0-9]$#
~^[0-9]$~
如果模式中包含分隔符,則需要用 \ 進行轉義,也可以採用preg_quote進行轉義。如果模式中包含較多的分割字符,建議更換其他的字符作爲分隔符。
$reg = /http:\/\//
$reg = 'http://';
$reg = '/' . preg_quote($p, '/') . '/';
分隔符後面可以使用模式修飾符,正則表達式中常用的模式修飾符有i、g、m、s、x、e等。它們之間可以組合搭配使用。
模式修飾符
模式修飾符 | 作用 |
---|---|
i | 不區分大小寫 |
g | 全局匹配 |
m | 將字符串視爲多行,不管是那行都能匹配 |
s | 將字符串視爲單行,換行符作爲普通字符 |
x | 將模式中的空白忽略 |
A | 強制從目標字符串開頭匹配 |
D | 如果使用$限制結尾字符,則不允許結尾有換行 |
U | 只匹配最近的一個字符串,不重複匹配 |
e | 配合函數preg_replace()使用,可以把匹配來的字符串當作正則表達式執行 |
元字符
元字符 | 作用 |
---|---|
\ | 一般用於轉義字符 |
^ | 在方括號外面,表示斷言目標的開始位置,但在方括號內部則代表字符類取反 |
$ | 斷言目標的結束位置(或在多行模式下是行尾) |
. | 匹配除換行符外的任何字符(默認) |
[ | 開始字符類定義 |
] | 結束字符類定義 |
| | 或,開始一個可選分支 |
( | 子組的開始標記 |
) | 子組的結束標記 |
? | 量詞,0 次或 1 次匹配 |
* | 量詞,0 次或多次匹配 |
+ | 量詞,1 次或多次匹配 |
{ | 自定義量詞開始標記 |
} | 自定義量詞結束標記,當我們確切的知道所匹配的字符長度的時候,可以使用{}指定匹配字符數。/\d{3}-\d{8}/ |
\w | 查找單詞字符。字符 ( 字母 ,數字,下劃線_ ) |
\W | 查找非單詞字符。 |
\d | 查找數字。 |
\D | 查找非數字字符。 |
\s | 查找空白字符。空格 |
\S | 查找非空白字符。 |
\b | 匹配單詞邊界。 |
\B | 匹配非單詞邊界。 |
\0 | 查找 NUL 字符。 |
\n | 查找換行符。 |
\f | 查找換頁符。 |
\r | 查找回車符。 |
\t | 查找製表符。 |
\v | 查找垂直製表符。 |
\xxx | 查找以八進制數 xxx 規定的字符。 |
\xdd | 查找以十六進制數 dd 規定的字符。 |
\uxxxx | 查找以十六進制數 xxxx 規定的 Unicode 字符。 |
貪婪模式與懶惰模式
正則表達式中每個元字符匹配一個字符
當使用 + 之後,它將匹配儘可能多的字符,既是貪婪模式。
但使用問號 ? 字符時,它將儘可能少的匹配字符,既是懶惰模式。
貪婪模式:在可匹配與可不匹配的時候,優先匹配
懶惰模式:在可匹配與可不匹配的時候,優先不匹配