• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >正则表达式 > PHP和正则表达式教程集合之二第1/2页

PHP和正则表达式教程集合之二第1/2页

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了php正则表达式,php正则表达式手册,php正则表达式函数,php正则表达式语法,php正则表达式匹配等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
正则表达式快速入门(二)
【导读】在本文里,我们主要介绍子模式(subpatterns),逆向引用(Back references)和量词(quantifiers)
在上篇文章里,我们介绍了正则表达式的模式修正符与元字符,细心的读者也许会发现,这部分介绍的非常简略,而且很少有实际的例子的讲解。这主要是因为网上现有的正则表达式资料都对这部分都有详细的介绍和众多的例子,如果觉得对前一部分缺乏了解可以参看这些资料。本文希望可以尽可能多涉及一些较高级的正则表达式特性。
  在本文里,我们主要介绍子模式(subpatterns),逆向引用(Back references)和量词(quantifiers),其中重点介绍对这些概念的一些扩展应用,例如子模式中的非捕获子模式,量词匹配时的greedy与ungreedy。
  子模式(subpatterns)与逆向引用(Back references)
  正则表达式可以包含多个字模式,子模式由圆括号定界,可以嵌套。这也是两个元字符“(”和“)”的作用。子模式可以有以下作用:
  1. 将多选一的分支局部化。
  例如,模式: cat(aract|erpillar|)匹配了 "cat","cataract" 或 "caterpillar" 之一,没有圆括号的话将匹配 "cataract","erpillar" 或空字符串。
  2. 将子模式设定为捕获子模式(例如上面这个例子)。当整个模式匹配时,目标字符串中匹配了子模式的部分可以通过逆向引用进行调用。左圆括号从左到右计数(从 1 开始)以取得捕获子模式的数。
  注意,子模式是可以嵌套的,例如,如果将字符串 "the red king" 来和模式 /the ((red|white) (king|queen))/进行匹配,捕获的子串为 "red king","red" 以及 "king",并被计为 1,2 和 3 ,可以通过“1”,“2”,“3”来分别引用它们,“1”包含了“2”和“3”,它们的序号是由左括号的顺序决定的。
  在一些老的linux/unux工具里,子模式使用的圆括号需要用反斜线转义,向这种(subpattern),但现代的工具已经不需要了,本文中使用的例子都不进行转义。
非捕获子模式(non-capturing subpatterns)
  用一对括号同时完成上面提到的子模式的两个功能有时会出现一些问题,例如,由于逆向引用的数目是有限的(通常最大不超过9),而且经常会遇到无需捕获的子模式定义。这时,可以在开始的括号后加上问号和冒号来表示这个子模式无需捕获,就向下面这样(?:red|white) (king|queen))。
  如果将“the white queen”作为模式匹配的目标字符串,则捕获的字串有“white queen”和“queen”,分别作为“1”和“2”,white虽然符合子模式“(?:red|white)”,但并不被捕获。
  我们前面已经介绍过用括号与问号表示模式修正符的方法,为方便起见,如果需要在非捕获子模式中插入模式修正符,可以把它直接放在问号和冒号之间,例如,下面两个模式是等效的。
  /(?i:saturday|sunday)/和/(??i)saturday|sunday)/。
  逆向引用(Back references)
  前面介绍反斜线作用时,已经提到它的一个作用就是表示逆向引用,当字符类之外的反斜线后跟一个大于0的十进制数时,它很有可能是一个逆向引用。它的含义正如它的名称如言,它表示对它出现之前已经捕获的子模式的引用。这个数字代表了它引用的左括号在模式中出现的次序,我们在介绍子模式时已经看到过逆向引用的一个例子,那里的过“1”,“2”,“3”分别表示所捕获的第一,第二,和第三个小括号定义的子模式的内容。
  值得注意的是,当反斜线后的数字小于10时,可以确定此为一个逆向引用,这样,这个逆向引用就可以出现在之前有相应数目的左圆括号被捕获前而不会出现混淆,只有整个模式能提供那么多的捕获子模式,就不会报错。说起来似乎很混乱,还是让我们来看下面这个例子。把介绍子模子时举的例子拿来修改一下,前面讲过字符串 "the red king" 来和模式 /the ((red|white) (king|queen))/匹配,捕获的子串为 "red king","red" 以及 "king",并被计为 1,2 和 3 ,现在把字符串,修改为" king,the red king",模式改为/3,the ((red|white) (king|queen))/,这个模式应该也是可以匹配的。不过,并非所有的正则表达式工具都支持这种用法,安全的做法是在相应序号的左括号之后使用与之相关的逆向引用。
  需要注意的另一点是逆向引用的值是在目标字符串中实际捕获的符合子模式的字符串片段而非该子模式本本身。例如/ (sens|respons)e and 1ibility/会匹配“sense and sensibility” 和 “response and responsibility”,但不会是 "sense and responsibility"。当被逆向引用的子模式后面有量词从而被重复匹配了多次,逆向引用的值会以最后一次匹配的值为准。例如/([abc]){3}/匹配字符串“abc”时,逆向引用“1”的值将是最后一次匹配的结果“c”。
  命名子模式(named subpattern)
  一些工具(例如Python)可以为逆向引用命名,从而定义出命名子模式。在Python中对正则表达式的使用是以函数或方法调用的格式,语法与这里举的例子有较大差别。有兴趣的朋友可以参看一下自己使用的工具来看看是否支持命名子模式。
非捕获子模式(non-capturing subpatterns)
  用一对括号同时完成上面提到的子模式的两个功能有时会出现一些问题,例如,由于逆向引用的数目是有限的(通常最大不超过9),而且经常会遇到无需捕获的子模式定义。这时,可以在开始的括号后加上问号和冒号来表示这个子模式无需捕获,就向下面这样(?:red|white) (king|queen))。
  如果将“the white queen”作为模式匹配的目标字符串,则捕获的字串有“white queen”和“queen”,分别作为“1”和“2”,white虽然符合子模式“(?:red|white)”,但并不被捕获。
  我们前面已经介绍过用括号与问号表示模式修正符的方法,为方便起见,如果需要在非捕获子模式中插入模式修正符,可以把它直接放在问号和冒号之间,例如,下面两个模式是等效的。
  /(?i:saturday|sunday)/和/(?:(?i)saturday|sunday)/。
  逆向引用(Back references)
  前面介绍反斜线作用时,已经提到它的一个作用就是表示逆向引用,当字符类之外的反斜线后跟一个大于0的十进制数时,它很有可能是一个逆向引用。它的含义正如它的名称如言,它表示对它出现之前已经捕获的子模式的引用。这个数字代表了它引用的左括号在模式中出现的次序,我们在介绍子模式时已经看到过逆向引用的一个例子,那里的过“1”,“2”,“3”分别表示所捕获的第一,第二,和第三个小括号定义的子模式的内容。
  值得注意的是,当反斜线后的数字小于10时,可以确定此为一个逆向引用,这样,这个逆向引用就可以出现在之前有相应数目的左圆括号被捕获前而不会出现混淆,只有整个模式能提供那么多的捕获子模式,就不会报错。说起来似乎很混乱,还是让我们来看下面这个例子。把介绍子模子时举的例子拿来修改一下,前面讲过字符串 "the red king" 来和模式 /the ((red|white) (king|queen))/匹配,捕获的子串为 "red king","red" 以及 "king",并被计为 1,2 和 3 ,现在把字符串,修改为" king,the red king",模式改为/3,the ((red|white) (king|queen))/,这个模式应该也是可以匹配的。不过,并非所有的正则表达式工具都支持这种用法,安全的做法是在相应序号的左括号之后使用与之相关的逆向引用。
  需要注意的另一点是逆向引用的值是在目标字符串中实际捕获的符合子模式的字符串片段而非该子模式本本身。例如/ (sens|respons)e and 1ibility/会匹配“sense and sensibility” 和 “response and responsibility”,但不会是 "sense and responsibility"。当被逆向引用的子模式后面有量词从而被重复匹配了多次,逆向引用的值会以最后一次匹配的值为准。例如/([abc]){3}/匹配字符串“abc”时,逆向引用“1”的值将是最后一次匹配的结果“c”。
  命名子模式(named subpattern)
  一些工具(例如Python)可以为逆向引用命名,从而定义出命名子模式。在Python中对正则表达式的使用是以函数或方法调用的格式,语法与这里举的例子有较大差别。有兴趣的朋友可以参看一下自己使用的工具来看看是否支持命名子模式。
重复(Repetition)和量词(quantifiers)
  在前面介绍逆向引用的部分里我们已经接触到了量词(quantifiers)的概念,例如前面的例子/([abc]){3}/表示三个连续的字符,每个字符都必然是 “abc”这三个字符中的一个。在这个模式里,{3}就属于量词。它表示一个模式需要重复匹配(repetition)的数目。
  量词可以放在下面这些项目之后:
  ?●单个字符(有可能是被转义的单个字符,如xhh)
  ?●“.”元字符
  ?● 由方括号表示的字符类
  ?● 逆向引用
  ?●由小括号定义的子模式(除非它是个断言,我们会在以后介绍)
  最通用的量词使用形式是用花括号括起的两个由逗号分隔的数字,如这样的格式{min,max},例如,/z{2,4}/ 可以匹配 "zz", "zzz", 或者 "zzzz",花括号中的最大值以及前面的逗号可以省略,例如/d{3,}/可以匹配三个以上的数字,数字的数目没有上限,而/d{3}/(注意,没有逗号)则精确的匹配3个数字。当花括号出现在不允许量词的位置或者语法与前面提到的不符时,这里它仅仅代表花括号字符本身而不再
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • PHP 正则表达式效率 贪婪、非贪婪与回溯分析(推荐)
  • 正则表达式惰性匹配模式(?)
  • 正则表达式全局匹配模式(g修饰符)
  • 正则表达式初运用之认证界面的实现代码
  • 常用正则表达式匹配代码介绍
  • PHP正则表达式抓取某个标签的特定属性值的方法
  • 20个正则表达式必知(能让你少写1,000行代码)
  • 可以少写1000行代码的正则表达式
  • 深入分析正则表达式的子模式
  • 正则表达式如何在PHP里灵活的应用

相关文章

  • 2017-05-1112个常用的js正则表达式
  • 2017-05-11JavaScript中常用的正则表达式日常整理(全)
  • 2017-05-11java 正则表达式基础,实例学习资料收集大全 原创
  • 2017-05-11asp提取内容中的手机号码,qq,网址的正则代码
  • 2017-05-11php正则表达式完全教程之精华篇
  • 2017-05-11正则匹配原理之 逆序环视深入 .
  • 2017-05-11正则表达式截取字符串的方法技巧
  • 2017-05-11正则表达式之 贪婪与非贪婪模式详解(概述)
  • 2017-05-11一个好用的正则匹配电话号手机号邮箱网址的方法
  • 2017-05-11常用正则表达式语法例句

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • php 正则表达式的子模式详解
    • Python中正则表达式match()、search()函数及match()和search()的区别详解
    • JScript中正则表达函数的说明与应用
    • 正则表达式不区分大小写以及解决思路的探索 .
    • 一个替换目录结构的正则表达式 实现目录的增加
    • eclipse、myeclipse中删除所有注释正则表达式
    • 12个常用的js正则表达式
    • php中utf-8编码下用正则表达式如何匹配汉字
    • Js 小数验证函数代码(基于正则)
    • PHP正则表达式完全教程之提高篇

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有