正则表达式(php)

正则表达式描述了一种字符串欧匹配模式,通过这个模式在特定的函数中对字符串进行匹配,查找,替换,分割等操作。

四部分组成
  • 原子
  • 元字符
  • 定界符
  • 模式修正符
定界符:

正则表达式通常都需要将模式表达式放入定界符之间。作为定界的字符,可以是除了字母,数字,反斜线“\” 以外的任何字符,通常使用“/”作为定界符,不过建议使用“#”。(不要问我什么。。。)

原子:

正则表达式最基本的组成单位,一个正则表达式中最少要有一个原子。可以将其详细划分为5类。

1.普通字符作为原子

大小写字母或者数字,如 0-9、az、AZ

2.一些特殊字符和元字符

任何一个符号都可以作为原子使用,比如!,@,等等。。但是如这个符号在正则表达式中有特殊意义我们应该使用“\”进行转义,像引号,加号,星号等。应该转义为 " , ' , * , +

3.非打印字符

所谓非打印字符,是一些在字符串中的格式控制符号,例如空格,回车,制表符等

4.使用“通用字符类型”作为原子

有时我们需要一个原子匹配一类字符
\d 等价于[0-9]
\D 和楼上相反
\s 匹配任意一个空白字符,等价于[\f\n\r\t\v]
\S 和楼上相反
\w 匹配任意一个数字,字母,下划线,等价于[0-9a-zA-Z_]
\W 和楼上相反
. 匹配除了任意一个字符,默认情况下不包括换行符相当于[^\n]

5.自定义原子表([])作为原子

使用原子表“[]”可以定义一组地位平等的原子,
且只能从中选择一个原子进行匹配
例如:

/[ajd]sp/      --可以匹配asp,jsp,dsp三个里面的任意一个.
/[^ajd]sp/    --可以匹配除了 asp,jsp,dsp三种以外的任何字符串,如xsp,nsp
元字符:

元字符不能单独出现,它必须用来修饰原子。
有以下几种类型的元字符:

1.限定符

限定原子出现多少次才能满足匹配。有六种限定符
“*”、表示任意次数
“+”、表示一次或多次
“?”、表示0次或者1次
“{n}”、自定义n次
“{n,}”、自定义n次以上
“{n,m}”、自定义n次到m次

2.边界限制

限制字符串或者单词的边界范围获得更准确的匹配结果
“^” 指字符串的开始
“$”指字符串的结束
“\b”描述字符串中的每个单词的前或后边界
“\B”表示非单词边界

3.模式选择符(|)

“|”用来分割多选一的情况,优先级最低

4.模式单元

模式单元是使用元字符“()”将多个原子组合成一个大原子,当成一个单元独立使用

5.后向引用

使用元字符“()”标记的开始和结束多个原子,不仅是一个独立的单元,也是一个子表达式。这样,对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配储存到一个临时缓冲区,可以被获取以后使用。所捕获的每个子匹配都按照正则表达式模式中从左至右所遇到的内容储存。储存子匹配的缓冲区编号从1开始至99。每个缓冲区可以使用'\1'、‘\2’、‘\3’这样的形式进行引用,当然了,需要在前面加上一个反斜线转义,变成这样‘\1’、‘\2’、‘\3’。
举个栗子:

'/^\d{4}\W\d{2}\W\d{2}/'      --这是一个匹配日期的格式,如2008-08/08 或2008/08-08
'/^\d{4}(\W)\d{2}\\1\d{2}/'   --这是一个匹配日期的格式,如2008-08-08 或2008-08-08

在第一个例子中我们可以发现两个“\W”可以匹配任意特殊字符,两者完全可以不是同一个特殊字符,
但在实际中我们要求日期间的特殊字符应该一致,比如都是“-”或者都是“/”。
而第二个例子达到了这种效果,这是因为模式“\W”加上了元字符“()”,结果已经被储存在了缓冲区,所以在第一个“\W”的位置使用“-”,则下一个位置使用“\1”引用时,匹配模式也必须是字符串“-”。
当需要使用模式单元而又不想储存匹配结果时,可以使用非捕获元字符“?:”、“?=” 或 “?!”忽略对相关匹配的保存。在一些正则表达式中,使用非储存模式单元是必要的,可以改变后向引用的顺序。如下所示:

'/(windows)(linux)\\2OS/'    --使用“\2”再次引用第二个缓冲区中的字符串“linux”
'/(?:windows)(linux)\\1OS/'  --使用“?:” 忽略了第一个子表达式的储存,所以“\1”所引用的就是“linux”   

》模式匹配的优先级

使用正则表达式时,需要注意匹配的顺序,通常是优先级从左到右进行运算,不同的优先级的运算先高后低。

如下表:

顺序 元字符 描述
1 \ 转义符号
2 ()、(?:)、(?=)、[] 模式单元和原子表
3 *、+、?、{n}、{n,}、{n,m} 重复匹配
4 ^、$、\b、\B、\A 、\Z 边界限制
5 I 模式选择
模式修正符:

模式修正符在正则表达式定界符之外使用(最后一个斜线 ""之后)模式修正符可以调整正则表达式的解释,扩展了正则表达式在匹配、替换等操作时的某些功能,而且修正符可以组合使用,下列表格中,列出了一些常用的模式修正符及其功能。

模式修正符 功能描述
i 匹配时不区分大小写
m 将字符串视为多行
s 设定了此修正符 '.'将匹配所有的字符,包括换行符
x 模式中的空白忽略不计,除非它已被转义
e 只用在preg_replace()函数中,在替换字符串中对逆向引用做正常替换,将其作为php代码求职,并用其结果换来替换所搜索的字符串
U 本修正符反转了匹配数量的值,使其不是默认的重复,而变成在后面跟上“?” 才变得重复
D 模式中的美元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。如果设定了m修正符忽略此选项
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容