admin 管理员组

文章数量: 887021


2023年12月17日发(作者:mg是常量元素吗)

正则表达式整理

邹义良

邮箱:it9981@

微博:/it266

论坛:

定义:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。

使用原则:可以使用字符串函数完成的功能,优先选择函数,复杂的操作,才选用正则表过式。

需要和函数一起使用,才能发挥出正则表达式的作用。(分割、匹配、查找、替换…)

php中提供两套正则表达式函数库:

扩展正则表达式函数(ereg_开头)

兼容正则表达式函数(preg_开头) 推荐学习和使用

正则表达式模式如何编写

语法:

1.定界符号

2.原子

3.元字符

4.模式修正符号

测试代码

$regex='/[^0-9a-zA-Z]/';

$str='1aA#';

echo '表达式:'.$regex.'  ';

echo '字符串:'.$str.'  ';

if(preg_match($regex,$str)){

echo '匹配成功';

}else{

echo '匹配失败';

}

?>

定界符:

起始和结束的符号。除了字母、数字和反斜线()以外的任何字符,都可以为定界符。

// || {} !! …… 没有特殊需要,都使用//作为定界符

定界符之间,是原子、元字符,字界符外边,是模式修正符。

有的语言中,可以没有定界符

原子:是正则表达式的最基本组成单位,必须至少包含一个原子。

只要在正则表达式中,可以单独使用的字符,都是原子。

1.包含所有打印(字母、数字,符号)和非打印字符(回车、空格等)。

正则表达式:/abc/ 字符串:1111111abc11 匹配成功 (包含abc,即匹配成功)

正则表达式:/abc/ 字符串:1111111ab11 匹配失败

2.有特殊意义的符号,想作为原子使用,需要转义(在前面加"")

* . + ? ( ) < >

正则表达式:/+/ 字符串:1111111ab11 匹配失败 因为该字符串中,不包含加号(+)

正则表达式:/./ 字符串:1111111.11 匹配成功 包含有点(.)

转义字符,可以将有特殊意义的字符,转成无意义的普通字符

转义字符,也可以将无特殊意义的普通字符,转成有意义的字符

表达式:/m/ 字符串:111111m111 匹配成功(一个字符加后,如果不是一个特殊意义,不影响,还是匹配那个字符本身)

3.可以直接使用一些代表范围的原子

d 任意一个十进制数字 表达式:/d/ 字符串:aaaaaa 匹配失败 表达式:/d/ 字符串:aaaaa8a 匹配成功(匹配到数字8)

D 任意一个非数字 表达式:/D/ 字符串:123456 匹配失败 表达式:/D/ 字符串:1234.56 匹配成功 (匹配到那个小数点)

s 任意一个空白字符(空格 r n t f) r是回车return n是换行newline 表达式:/s/ 字符串:123 匹配失败 表达式:/s/ 字符串:1 23 匹配成功

S 任意一个非空白字符 表达式:/S/ 字符串:1 23 匹配成功(里面有一个空格)

w 任意一个字 a-zA-Z0-9_ (大小写字母、数字和下划线_)

表达式:/w/ 字符串:123ab 匹配成功 表达式:/w/ 字符串:!@#$%^ 匹配失败(全是符号,没有字)

表达式:/w/ 字符串:!@#$%^_ 匹配成功(匹配到最后的那个下划线)

W 任意一个非字 (除了大小写字母、数字和下划线_)

表达式:/W/ 字符串:aa123_ 匹配失败(没有一个特殊符号) 表达式:/W/ 字符串:aa123._ 匹配成功(匹配到那个点.)

4.自定义一个原子表[ ],可以匹配方括号中的任意一个原子(中括号中的,只要出现一个就匹配成功)

表达式:/[13579]/ 字符串:222221 匹配成功(匹配到1) 表达式:/[13579]/ 字符串:22222 匹配失败

表示范围:

表达式:/[0-6]/ 字符串:aa789 匹配失败 表达式:/[0-6]/ 字符串:aa6789 匹配成功

表达式:/[0-9a-f]/ 字符串:1HH 匹配成功(匹配到1) 表达式:/[0-9a-f]/ 字符串:AA 匹配失败 表达式:/[0-9a-f]/ 字符串:AAa 匹配成功

[^]表示取反,表示除了原子表中的原子,都可以表示 (^必须在中括号[]内的第一个字符处出现)

表达式:/[^0-9]/ 字符串:12345 匹配失败(除了0-9之间的才能匹配成功) 表达式:/[^0-9]/ 字符串:12345. 匹配成功(点.不在0-9的范围之间)

表达式:/[^0-9a-zA-Z]/ 字符串:1aA 匹配失败(不能出现数字和字母) 表达式:/[^0-9a-zA-Z]/ 字符串:1aA# 匹配成功(匹配到#)

用自定义原子表,代替表示范围的原子:

d 任意一个十进制数字 [0-9]

D 任意一个非数字 [^0-9]

s 任意一个空白字符(空格 r n t f v) [rntf v] 注意里面有一个空格

S 任意一个非空白字符 [^rntf v]

w 任意一个字 a-zA-Z0-9_ (大小写字母、数字和下划线_) [a-zA-Z0-9_]

W 任意一个非字 (除了大小写字母、数字和下划线_) [^a-zA-Z0-9_]

5. "." 点

默认情况下,表示除换行符外任意一字符。

表达式:/1.2/ 字符串:1aaa2 匹配失败 表达式:/1.2/ 字符串:1a2 匹配成功

表达式:/1.*2/ 字符串:1a2 匹配成功 (表示1和2之间,可以是任意多个任何字符[除换行符]) 表达式:/1.*2/ 字符串:12 匹配成功

原字符

是一种特殊字符,是用来修饰原子用的,不可以单独出现。

* 表示前面的原子,可以出现0次、1次、多次(可有可无)

表达式:/1a*2/ 字符串:1a2 匹配成功 表达式:/1a*2/ 字符串:12 匹配成功 (1和2之间的a可有可无)

+ 表示前面的原子,可以出现1次、多次(至少一次)

表达式:/1a+2/ 字符串:12 匹配失败 表达式:/1a+2/ 字符串:1a2 匹配成功

? 表示前面的原子,可以出现0次、1次(要么有一次,要么没有)

表达式:/1a?2/ 字符串:1a2 匹配成功 表达式:/1a?2/ 字符串:1aa2 匹配失败

{} 定义前面元子出现次数

{m} 只出现m次 表达式:/1a{1}2/ 字符串:1aa2 匹配失败 表达式:/1a{1}2/ 字符串:1a2 匹配成功

{m,n} 最少m次,最多n次 表达式:/1a{1,2}2/ 字符串:1a2 匹配成功 表达式:/1a{1,2}2/ 字符串:1aaa2 匹配失败

{m,} 前面元子最少m次,多不限 表达式:/1a{2,}2/ 字符串:1a2 匹配失败

表达式:/1a{2,}2/ 字符串:1aaa2 匹配成功

以下等价:

* {0,}

+ {1,}

? {0,1}

^ 不放在原子表[ ]中,直接在一个正则表达式的第一个字符出现,则表示必须以这个正表达式匹配的字符开始。

表达式:/^book/ 字符串:123book 匹配失败 表达式:/^book/ 字符串:bookaaa 匹配成功

$ 直接在一个正则表达式的最后一个字符出现,则表示必须以这个正则表达式匹配的字符结束

表达式:/book$/ 字符串:bookaaa 匹配失败 表达式:/book$/ 字符串:aaabook 匹配成功

表达式:/^book$/ 字符串:bookbook 匹配失败 表达式:/^book$/ 字符串:book 匹配成功 以book开始,又以它结束,中间没有别的

表达式:/^book.*book$/ 字符串:bookbook 匹配成功 表达式:/^book.*book$/ 字符串:book9999book 匹配成功

| 表示或的关系(出现一个就行),优先级最低

表达式:/cat|dog/ 字符串:111cat222 匹配成功 表达式:/cat|dog/ 字符串:111dog222 匹配成功

表达式:/cat|dog/ 字符串:111t222 匹配失败 想匹配t或g这两个字母,需要加括号,因为|优先级最低,如下:

表达式:/ca(t|d)og/ 字符串:111catog222 匹配成功 ca和og之间,有t或g,就能匹配成功

b 表示一个边界

B 表示一个非边界

表达式:/bisb/ 字符串:this is isLand 匹配成功 表达式:/bisb/ 字符串:thisis isLand 匹配失败

表达式:/Bisb/ 字符串:this is isLand 匹配成功 这样匹配到的是this单词里的is

( ) 括号的作用:

1.作为大原子使用

表达式:/abc{2}/ 字符串:abcabc 匹配失败 表达式:/(abc){2}/ 字符串:abcabc 匹配成功

2.改为优先级

表达式:/cat|dog/ 字符串:cat 匹配成功 表达式:/ca(t|d)og/ 字符串:cat 匹配失败 表达式:/ca(t|d)og/ 字符串:catog 匹配成功

3.作为子模式使用

测试用函数:preg_match($regex,$str,$arr);

表达式:/d{4}-d{2}-d{2} d{2}:d{2}:d{2}/ 字符串:时间是:2012-02-04 09:42:05 pm。

匹配成功 Array ( [0] => 2012-02-04 09:42:05 )

表达式:/(d{4}-d{2}-d{2}) (d{2}:d{2}:d{2})/ 字符串:时间是:2012-02-04 09:42:05 pm。

匹配成功 Array ( [0] => 2012-02-04 09:42:05 [1] => 2012-02-04 [2]

=> 09:42:05 ) 加了两个括号,把日期和时间,单独提取出来

表达式:/(d{4}-d{2}-d{2}) (d{2}:d{2}:d{2}) (am|pm)/ 字符串:时间是:2012-02-04 09:42:05 am。

匹配成功 Array ( [0] => 2012-02-04 09:42:05 am [1] => 2012-02-04

[2] => 09:42:05 [3] => am )

把am或pm也匹配出来,改变优先级时,也当子模式处理了,怎样取消am|pm括号的子模式,如下:

表达式:/(d{4}-d{2}-d{2}) (d{2}:d{2}:d{2}) (?:am|pm)/ 字符串:时间是:2012-02-04 09:42:05 am。

匹配成功 Array ( [0] => 2012-02-04 09:42:05 am [1] => 2012-02-04

[2] => 09:42:05 ) $arr数组中,只有两个成员了

?= ?! 见底下的说明。

4.反向引用

1 取第一个子模式 2 取第二个子模式 …… 注意:表达式如果使用的是双引号,需要转义反斜杠本身 1

日期格式和多种: yyyy-MM-dd 或 yyyy/MM/dd yyyy#MM#dd

表达式:/d{4}[-#]d{2}[-#]d{2} d{2}:d{2}:d{2}/ 字符串:时间是:2012/02-04 09:42:05 am。 匹配成功 但不符合要求

如果使用/作为分隔符,则后面的需要统一使用/

表达式:/d{4}([-#])d{2}1d{2} d{2}:d{2}:d{2}/ 字符串:时间是:2012/02-04 09:42:05 am。 匹配失败

表达式:/d{4}([-#])d{2}1d{2} d{2}:d{2}:d{2}/ 字符串:时间是:2012/02/04 09:42:05 am。 匹配成功

1表示取第一个子模式里的内容来匹配

优先级从高到低:

转义字符优先级最高

( ) (?:) [ ]

* + ? {}

^ $ b 以什么开头,以什么结尾,边界 等

| 这个优先级最低

模式修正符号: ium等 放在定界符之外,一次可使用一个,也可使用多个,对整个正则表达式调优用的

表达式:/book/ 字符串:Book 匹配失败 表达式:/book/i 字符串:Book 匹配成功

i 不区分大不写

m 没加m情况下,字符串视为单行处理,加上m后字符串任何一行的开头,都可以匹配^,任何一行的结尾都可以匹配$

s 视为单行。受影响:元字符.(点),不能表示换行符号,用s后,点可以匹配任意字符,包括换行符(视为单行了,换行符就是一个普通符号了)

x 模式中的空白,忽略不计

表达式:/bo ok/ 字符串:book 匹配失败 表达式:/bo ok/x 字符串:book 匹配成功

e 在preg_replace函数中使用(作用:在第二个参数中,可以直接在双引号中使用函数,即当作php代码求值)。

A 以正则开始

Z 以正则结束

U 正则表达式,比较贪婪 ( .* .+ 这两个要注意) 在后面加?表示取消贪婪模式: .*? .+?

表达式:/#(.*)#/ 字符串:#book#ssss#desk#ssss 匹配成功 Array ( [0] =>

#book#ssss#desk# [1] => book#ssss#desk ) 贪婪到最后一个#号了

表达式:/#(.*)#/U 字符串:#book#ssss#desk#ssss 匹配成功 Array ( [0] =>

#book# [1] => book )

有些语言中,不支持模式修正符号,可以在.* 或.+ 后加一个?如下

表达式:/#(.*?)#/ 字符串:#book#ssss#desk#ssss 匹配成功 Array ( [0] =>

#book# [1] => book )

同时使用?和U会相互抵消

相关函数

int preg_match ( string pattern, string subject [, array matches [, int flags]] ) 只匹配1次

int preg_match_all ( string pattern, string subject, array matches [, int flags] )

strstr(string,要找的字符串) 如果找到,则返回要找到的字符串及之后的

stristr() 同上,不区分大小写

strpos() 返回第一次出现的位置

stripos() 不区分大小写

strrpos()最后一次出现的位置

substr()

str_replace(string,string,string) (查找什么,替换成什么, 用于处理的原字符串)

str_replace(array,string,string) 将数组内的,都替换

str_replace(array,array,string) 对应着替换

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )

explode("分割字符",string) 返回数组

preg_split('/[,。?;!]/',str) 按中文标点符号分割

impolde("--",数组) 用"--"组合一个数组 jion(别名)

preg_grep() 从数组中匹配内容

preg_quote()给特殊符号加上转义字符:

正则表达式的特殊字符包括:. + * ? [ ^ ] $ ( ) { } = ! < > | : 。


本文标签: 匹配 使用 字符