什么叫正则表达式
正则表达式是对字符串进行操作的一种逻辑公式
用一些特定的字符组合成一个规则字符串,称之为正则匹配模式。
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( reg, str[, match]);如果提供了参数matches,它将被填充为搜索结果。 matches[0] 将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。 |
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( pattern, replacement, $string); |
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 字符。 |
贪婪模式与懒惰模式
正则表达式中每个元字符匹配一个字符
当使用 + 之后,它将匹配尽可能多的字符,既是贪婪模式。
但使用问号 ? 字符时,它将尽可能少的匹配字符,既是懒惰模式。
贪婪模式:在可匹配与可不匹配的时候,优先匹配
懒惰模式:在可匹配与可不匹配的时候,优先不匹配