1. 正则表达式
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
------ From Wikipedia
正则表达式其实就是一组字符串,它是由字母、数字、符号组成按照一定的规则组成的。可以把正则表达式理解为一种“模式”,一般当需要对字符串进行处理,而自带的函数(例如PHP自带的字符串处理函数)满足不了要求的时候,就会选择使用正则表达式。使用正则表达式可以对指定的字符串进行查找、替换、分割等操作。
PHP 5.3.0之前支持两种类型的正则表达式:
- POSIX正则表达式
- PERL正则表达式
POSIX正则表达式和PERL正则表达式的语法几乎是相同的,它们之间的区别主要在于以下两点:
1. 定界符
POSIX正则表达式没有定界符,PERL正则表达式有定界符。
PERL正则表达式: /\d{4}\W\d{2}\W\d{2}/
POSIX正则表达式: \d{4}\W\d{2}\W\d{2}
以上的正则表达式都可以匹配类似于“2016-08-19”这样的时间格式。在PERL正则表达式中开始和结束位置上的两个字符"/",就是定界符。
2. 修正符
POSIX正则表达式没有修正符,PERL正则表达式有修正符。
PERL正则表达式: /bob/i
POSIX正则表达式: bob
以上的正则表达式用来匹配特定的单词,其中在PERL正则表达式中最后一个字符"i"就是修正符,它是对正则表达式的扩展,"i"表示忽略大小写。也就是说PERL的正则表达式除了可以匹配含有bob的字符串,还可以匹配含有"Bob","BOB"等所有三个字母大小写放在一起的组合的字符串。
但是PHP在5.3.0以后就不再支持POSIX风格的正则表达式,所以这里就介绍PERL正则表达式。
2.PERL正则表达式语法
一个PERL正则表达式可以由定界符、用于匹配的元素(原子)、元字符、模式修正符组成。
2.1 定界符
/\d{4}\W\d{2}\W\d{2}/
上面的正则表达式开始和结束位置上面两个"/"就是定界符,定界符是正则表达式的边界。规定除了数字、字母、反斜杠(\)不能用做定界符,其余的符号都可以用做定界符。常用的定界符就是"/"、"#"。
**2.2 用于匹配的元素(原子)**
>```
/a{2}\W\d{4}[h-z]/
顾名思义,用于匹配的元素是正则表达式中最基本的成员,它就是被拿来和目标字符串进行匹配的东西。在上面的正则表达式中"a{2}"、"\W"、"\d{4}"、"[h-z]"都是用于匹配的元素。在正则表达式中以下元素可以用做匹配的元素:
(1). 所有的数字、字母。 例如:1、2、3、a、b等。
(2). 被元字符修饰的数字或字母。例如:a{2}、[h-z]等。
(3). 元字符也可以用作匹配的字符,但是需要用转义字符("")进行处理。例如:\* 、\+ 分别用来匹配*和+。
(4). 许多普通的字母被转以字符修饰后表示一些特殊的含义也可以用作匹配的元素。例如:\w 表示匹配任意一个字,如字母、数字、下划线。\W表示匹配任意一个非字。
2.3 元字符
元字符被用来修饰用于匹配的元素。不可以单独出现!下面对常用的元字符进行总结。
(1) * 表示它前面的元素可以出现0次至多次。
(2) + 表示它前面的元素可以出现1次或者多次。
(3) ? 表示它前面的元素可以出现0次或者1次。
(4) . 可以匹配除换行符外任意一个字符,它和*组合可以匹配任意的字符或者字符串。
(5) [] 表示匹配"[]"内表示的范围的任意一个字符、数字:
/[a-z]/ 可以匹配任意一个处于a和z之间的字母
(6) {} 表示它前面的字符可以出现的次数:
/a{m}/ 表示a可以出现m次
/a{m,n}/ 表示a至少出现m次,至多出现n次(n>m)
/a{m,}/ 表示a至少出现m次
*可以表示为{0,} +可以表示为{1,} ?可以表示为{0,1}
(7) ^ 在一个正则表达式开始的位置出现,表示字符串必须以这个正则表达式开始:
/^abc/ 匹配所有以abc开始的字符串
^出现在[]里面表示匹配[]表示的范围之外的元素:
/[^a-z]/ 匹配在a到z范围之外的所有字符
(8) $ 在一个正则表达式结束的位置出现,表示字符串必须以这个正则表达式结束:
/abc$/ 匹配所有以abc结束的字符串
(9) | 表示或的关系
(abc|abd) 匹配字符串abc或者abd
(10) ( ) 括号, 作用如下:
(i) 把单个的元素用括号括起来作为一个整体使用
(ii) 改变优先级:加上括号可以提高优先级。
(iii) 作为子模式使用 :
在下面所说的 preg_match 方法中,结果会被赋值到 $arr 变量中,先匹配外层模式,再匹配内层模式。
$pattern="/(\d{4}(\W)\d{2}\W\d{2})\s+(\d{2}(\W)\d{2}\W\d{2})\s+(?:am|pm)/"; //正则表达式模式
$string="today is 2010/09/15 15:35:28 pm..."; //需要和上面模式字符串进行匹配的变量字符串
if(preg_match($pattern, $string, $arr)){
print_r($arr);
}
结果
Array
(
[0] => 2010/09/15 15:35:28 pm
[1] => 2010/09/15
[2] => /
[3] => 15:35:28
[4] => :
)
当我们在一个正则表达式中需要重复用到一个子模式时,可以进行反向引用,直接在模式中把子模式提取出来然后再进行使用。\1 取第一个子模式、 \2取第二个子模式,但是注意是单引号还是双引号引起来的正则表达式,因为在双引号引起来的正则表达式中,它是可以解释转义字符的,所以 \1 必须要写成 \1。 在单引号引起来的正则表达式中,则不会出现这种情况,\1 仍然可以写成 \1:
$pattern1="/(\d{4}(\W)\d{2}\W\d{2})\s+(\d{2}(\W)\d{2}\W\d{2})\s+(?:am|pm)/"
$pattern2="/(\d{4}(\W)\d{2}\\1\d{2})\s+(\d{2}(\W)\d{2}\\2\d{2})\s+(?:am|pm)/"
上面的两个正则表达式表示的是一个意思。(\W)作为第一个子模式被使用过了,所以就被存储起来,\\1就表示它。同理\\2也可以这么理解
当我们不想把括号内的整体作为一个在匹配的时候作为一个子模式,可以在模式前面加上"?:"即可。上面的正则表达式中
(?:am|pm)
在匹配时并没有作为子模式进行匹配。
元字符的优先级:
1)\ 转义符最高
2)(),(?:) 括号其次
3)* + ? {}
4)^ $ \b
5)|
2.4 模式修正符
模式修正符就是几个特殊字母,放在正则表达式的结尾。它的作用就是用来扩展正则表达式的功能,可以单独使用也可以几个放在一起使用。
常见的模式修正符:
i 表示在用模式进行匹配的时候不区分大小写
m 表示把要匹配的目标字符串的每一行都当作一个整体的字符串来进行匹配,这个修正符主要是对元字符^和$产生影响。例如:
str = "abc
efg
23";
pattern = "/^efg/m"
使用上面的正则表达式来匹配str字符串就会匹配到efg。但是如果正则表达式的结尾不加上m就会匹配不到任何字符。
x 表示忽略正则表达式中的空格。例如:
pattern = "/a b c/";
str = "abc";
使用上面的正则表达式依然可以匹配到str。
e 正则表达式必须使用在 preg_replace 函数中使用
A 表示必须以正则表达式开头,相当于加上^
Z 表示必须以正则表达式结尾,相当于加上$
U 表示取消贪婪模式(表示在成功匹配的前提下尽可能多的匹配)
参考文章链接:
http://cuiqingcai.com/1186.html
https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F
http://58582786.blog.51cto.com/1550000/1346431
声明:本篇文章为作者在学习正则表达式时的总结,文章中的内容有来自互联网的,并非自己100%原创。