1.正则表达式是用来匹配和处理文本的字符串。几乎所有的语言
和工具都支持正则表达式。
2.正则表达式的两种基本用途:搜索和替换。
3.匹配单个字符:
(1).匹配纯文本;
例1:
$aaa='/ben/';
$str='Hello,my name is ben!';
$cc=preg_match($aaa, $str);
//使用正则表达式匹配原始文本中的字符,如果能匹配,则返回true
echo $cc; //值为'true'
绝大多数正则表达式引擎的默认行为是只返回第一个匹配结果,如果要
进行全局匹配,则应在相应的语言中搜索其支持的方式。
正则表达式是区分字母大小写的,所以ben不匹配BEN,在PHP中。如果
不想区分字母的大小写,必须使用i限定符。
(2).匹配任意字符
在正则表达式里,特殊字符(或字符集合)用来给出要搜索的东西。.字符(英文
句号)可以匹配任何一个单个的字符、字母、数字甚至是 . 本身(换行符除外)。
例2:
$str=array('sales1.xls','orders3.xls','sales2.xls','sales3.xls','apac1.xls','europe2.xls
','na1.xls','na2.xls','sa1.xls');
$p='/sales./';
preg_match($p,$str);
'$str'中有三个字符匹配正则表达式'$p',分别是:sales1.xls,sales2.xls,sales3.xls
在同一个正则表达式中允许出现多个 .字符,它们既可以连续出现,也可以间隔着
出现模式的不同位置。
(3).匹配特殊字符
.子符在正则表达式里有着特殊的含义。如果模式里需要一个.,就必须在.的前面
加上一个\(反斜杠)字符来对它进行转义。
\是一个元子符。
4.匹配一组字符
(1).匹配多个字符中的某一个
在正则表达式里,我们可以使用一个元子符 [ 和 ] 来定义一个字符集合。在使用 [
和 ] 定义的字符集合里 ,这两个元字符之间的所有字符都是该集合的组成成分,字符
集合的匹配结果是能够与该集合里的任何一个成员相匹配的文本。
例4:
$aaa='/[12345]as/';//该字符集合将匹配'1as,2as,3as,4as,5as'的字符
$str='5as';
$cc=preg_match($aaa, $str);
echo $cc;
(2).利用字符集合区间
对于上述的字符集合,可以举例:/[ns]a[1234567890]/,其匹配的第一个
字符是以n或以s开头,第二个字符是a,第三个字符是0到9的任意数字。
在使用正则表达式的时候,会经常使用到一些字符区间(比如0-9,A-Z等)。为
简化字符区间的定义,正则表达式提供了一个特殊的元子符,字符区间可以用- (连
字符)来定义。
字符区间并不局限于数字,以下这些都是合法的字符区间:
A-Z:匹配从A到Z的所有大写字母;
a-z:匹配从a到z的所有小写字母;
A-F:匹配从A到F的所有大写字母;
A-z:匹配从ACS||字符A到字符z的所有字母。
在同一个字符集合里可以给出多个字符区间,比如:[0-9a-zA-Z]。
(3).取非匹配
字符集合可以用元字符^来求非,即是吧给定的字符集合强行排除在匹配
操作以外,除了该字符集合里的字符,其他字符都可以匹配。
例如: [^0-9]匹配的是任何不是数字的字符。
5.使用元子符
(1).对特殊字符进行转义
在元子符前面加上一个反斜杠就可以对它进行转义:
例如:/myfun[0]/ 匹配的是myfun0
myfun\[0\] 匹配的是myfun[0]
(2).匹配空白字符
常用的空白字符有以下几种:
[\b]:回退并删除一个字符(Backspace键)
\f: 换页符;
\n:换行符;
\r: 回车符;
\t: 制表符(Tab键);
\v: 垂直制表符;
(3).匹配特定的字符类别
\d:匹配任何一个数字字符(等价于[0-9]);
\D:匹配任何一个非数字字符(等价于[^0-9])
\w:匹配任何一个数字字母字符(大小写均可)或下划线字符(等价于[0-9a-zA-Z_])
\W:匹配任何一个非数字字母字符(大小写均可)或下划线字符(等价于[^0-9a-zA-Z_])
\s:匹配任何一个空白字符(等价于[\f\n\r\t\v])
\S:匹配任何一个非空白字符(等价于[^\f\n\r\t\v])
6.重复匹配
(1).匹配一个或多个字符:
要想匹配同一个字符(或字符集合)的多次重复,只要简单的给这个字符(或字符集合)加上
一个+字符作为后缀就行了。
+匹配一个或多个字符(至少一个:不匹配零个字符的情况)。例如:a匹配a本身;a+将
匹配一个或多个连续出现的a。类似的,[0-9]匹配任意单个数字,[0-9]+将匹配一个或多
个连续的数字。
注意:在给一个字符集加上+后缀的时候,必须把+放在这个字符集合的外面。
比如:[0-9]+匹配一个或多个连续的数字;[0-9+]匹配一个单个的数字字符或加号;
注:+是一个元子符。如果需要匹配+本身,就必须使用它的转义序列\+。
(2).匹配零个或多个字符
+匹配一个或多个字符,但不匹配零个字符,+最少也要匹配一个字符。
将 * 放在一个字符(或字符集合)的后面,就可以匹配该字符(或字符集合)连续出现零次
或多次的情况。
(3)匹配零个或一个字符
将 ? 放在一个字符(或字符集合)的后面,就可以匹配该字符(或字符集合)出现零次
或1次的情况,最多不超过1次。
注意:如果打算同时使用[ ] 和?,则要把?放在[ ] 之外。
(4).匹配的重复次数
重复次数要用 { 和 } 字符来给出,把数字写在它们之间。
如果为/\d{3}/,表示匹配当前的字符中含有连续的是三个数字;
如果为/\d{2,4},则表示数字至少重复2次,最多重复4次;
如果为/\d{3,}/,则表示数字字符最少重复三次。
字符{ 和 } 是元字符,如果要匹配它们本身,则需要对它们进行转义。
7.位置匹配
如果需要对某段文本的特定位置进行匹配,则需要进行位置匹配。
(1).边界
位置匹配用来解决在什么地方进行字符串匹配操作的问题。使用边界
匹配,也就是在正则表达式里用一些特殊的元字符来表明我们想让匹配操作
在什么位置(或边界)发生。
(2).单词边界
第一种边界(也就是最常用的边界)是由限定符\b指定的单词边界。即:\b
用来匹配一个单词的开始或结尾。
注:\b匹配的是这样的一个位置:这个位置位于一个能够用来构成单词的字符
和一个不能用来构成单词的字符之间。
例:\bcat\b 用来匹配单词 cat 。
注意:如果想匹配一个完整的单词,就必须在想要匹配的文本的前后都加上\b限定符。
\B-\B将匹配一个前后都不是单词边界的连字符。
\bcat:匹配一个以cat开头的字符;cat\b:匹配一个以cat结束的字符。
(3).字符串边界
用来定义字符串边界的元子符有两个:一个是用来定义字符串开头的^ ; 另一个是用来定义
字符串结尾的$。
8.使用子表达式
(1).子表达式
子表达式是一个更大的表达式的一部分;把一个表达式划分为一系列子表达式
的目的是为了把那些子表达式当作一个独立的元素来是使用。
子表达式必须用( 和 )括起来。
( 和 )是元字符,如果要匹配其本身,就必须使用它的转义序列。
例1:
( ){2,}匹配的是两个连在一起的符号
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\的匹配也可以这样来写:(\d{1,3}\.){3}\d{1,3}\
(2).子表达式的嵌套
子表达式允许进行多层嵌套。
9.回溯引用:前后一致匹配
(1).回溯引用匹配
先看例子:[ ]+(\w+)[ ]+\1,在该正则表达式中[ ]+匹配一个或多个空格,\w+匹配
一个或多个字母数字字符,[ ]+匹配随后的空格,此时\w+是在括号中的,它是一
个子表达式,这个子表达式不是用来进行重复匹配的。最后一部分\1:这是一个
回溯引用,引用的是前面划分出来的那个子表达式。例如若\w+匹配字符of时,\1也
匹配单词of。
\1表示的是模式里的第一个子表达式;\2代表模式里的第2个子表达式,以此类推。
\0用来匹配整个正则表达式。
注意:回溯引用只能用来引用模式里的子表达式(即用(和)括起来的正则表达式片段)
(2).回溯引用在替换操作中的应用
10.前后查找
(1).向前查找
向前查找指定了一个必须匹配但不在结果中返回的模式。
一个向前查找模式其实就是一个以?=开头的子表达式,需要匹配的文本跟在=的后面。
例1:/.+(?=:)/匹配的是带有冒号:的前面的字符,比如http:中的http,ftp:中的ftp,但此
处的:并没有跟在最终的结果里,只匹配其前面的字符。
注意:向前查找和向后查找匹配本身其实是有返回结果的,只是这个节点的字节长度永
远是0而已。因此,前后查找操作有时也称零宽度(zero-width)匹配操作。
任何一个子表达式都可以转换为一个向前查找表达式,只需要给它加上一个?=前缀即可。
在同一个搜索模式里可以使用多个向前查找表达式,它们可以出现在模式里的任意位置。
(2).向后查找
向后查找操作符是?<=,操作方法类似向前操作符。
注意:向前查找模式的长度是可变的,它们可以包含.和+之类的元字符,所以非常灵活。
而向后查找模式只能是固定长度,这是一条几乎所有的正则表达式实现都遵守的限制。
(3).负向前查找和负向后查找
1218

被折叠的 条评论
为什么被折叠?



