这篇文章主要介绍了正则表达式之零宽断言,简单介绍了零宽断言的概念、分类及php实现技巧与相关注意事项,需要的朋友可以参考下

本文实例讲述了正则表达式之零宽断言。分享给大家供大家参考,具体如下:

前言

之前我曾写了一篇关于正则表达式的文章(//www.jb51.net/article/111359.htm) 在该文章中详细介绍了正则,但是关于零宽断言介绍却是很少提及到。现在将该内容补充一下。在本文中,主要解决如下问题:

① 什么是零宽断言,为什么要使用零宽断言

② 怎样使用零宽断言

概念

零宽断言,大多地方这样定义它,用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像 \b ^ $ \< > 这样的锚定作用,用于指定一个位置,这个位置应该满足一定的条件(即断言),因此它们也被称为零宽断言。我的理解是在一个限定位置的字符串之前或之后进行匹配查找。所以零宽断言,执行过程分两种情况,如果是正向断言,应该是这样的,第一步,判断判断断言是否为真(即是否满足一定条件)第二步,如果满足条件,则进行下一步查找匹配。如果是反向断言,第一步还是按照正则表达式顺序去匹配。第二步,遇到反向代言,判断是否满足反之代言。

正先行断言

什么是正先行断言,就是在字符串相应位置之前进行查找匹配,使用 (?=exp) 匹配exp前面的位置。

实例

$str="abcgwcab";

$parent='/bc(?=gw)/';

$str=preg_match($parent,$str,$match);

var_dump($match);

/**

输出结果:

int 1

array (size=1)

0 => string 'bc' (length=2)

*/

解析:首先查找字符串”abcgwcab”中gw位置,断言为真,然后在匹配bc。如果将正则表达式写成$parent='/bc(?=gw)ca/'; 将会匹配不成功。

反先行断言

什么是反先行断言,使用 (?!exp) 匹配后面跟的不是exp。

实例:

$str="abcgwcab";

$parent='/bc(?!ww)gw/';

$str=preg_match($parent,$str,$match);

var_dump($str);

var_dump($match);

/**

输出:

int 1

array (size=1)

0 => string 'bcgw' (length=4)

*/

解析:首先判断字符串是否包含bc,然后判断其后面不是ww,最后匹配gw。可以看出反向断言之前后之后,能够在添加其他匹配条件。

正后发断言

什么是正后发断言,就是在字符串相应位置之后进行查找匹配, (?<=exp) 匹配exp后面的位置

实例:

$str="abcgwcab";

$parent='/(?<=gw)ca/';

$str=preg_match($parent,$str,$match);

var_dump($str);

var_dump($match);

/**

输出结果:

int 1

array (size=1)

0 => string 'ca' (length=2)

*/

解析:第一步,查找字符”abcgwcab”中是否包含有gw,返回结果为true,然后进行第二步,查找gw后面是否有ca。

反后发断言

什么是反后发断言,使用(?

$str="abcgwcab";

$parent='/(?

$str=preg_match($parent,$str,$match);

var_dump($str);

var_dump($match);

/**

int 0

array (size=0)

empty

*/

解析:首先在字符串中匹配gw,然后判断其前面是不是bc,发现其前面是bc,故返回false。

练习题

例1:\d+(?=abc)

判断一个字符串中是否包含'abc',且其前面是否包含一个或多个数字

例2:(?<=\d\d)\w

判断字符串中是否存在连续两个数字,且其后面包含一个字母

例3:\d{3} (?!55)

判断字符串中是否包含连续三个数字,且三个数字后面不是55

例4:(?

判断一个字符串是否包含一个字母加数字的组合,且其前面不是ac

总结

先行断言与后发断言区别?

先行断言是判断断言之前的正则表达式,断言在其他正则表达式之后。后发断言是判断断言之前的正则表达式,断言在其他正则表达式之前。这里的先与后,是其他匹配相对应断言在正则表达式中的顺序。

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具:http://tools.jb51.net/regex/javascript

正则表达式在线生成工具:http://tools.jb51.net/regex/create_reg

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php正则表达式用法总结》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

php 零宽断言,正则表达式之零宽断言实例详解【基于PHP】相关推荐

  1. php byte转 宽字符,C++宽字符与普通字符的转换实例详解

    C++宽字符与普通字符的转换实例详解 把字符串转换成宽字符串, 实例代码: wstring string2Wstring(string sToMatch) { #ifdef _A_WIN int iW ...

  2. [python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解

    一.学习目标 了解什么是色彩空间 了解opencv中色彩空间的转换 目录 [python opencv 计算机视觉零基础到实战] 一.opencv的helloworld [[python opencv ...

  3. php正则实例,php 正则表达式实例详解(适合初学者)

    正则表达式实例详解(适合初学者) 数学公式正则表达式: (?'kh'()*([- ]){0,1}[0-9.] (?'-kh'))*([ -*/]{1}(?'kh'()*((?<=()([- ]) ...

  4. 站长在线Python精讲:在Python中使用正则表达式的sub()方法替换字符串详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用正则表达式的sub()方法替换字符串详解>. 在Python中使用正则表达式的sub()方法替换字符串. ...

  5. 站长在线Python精讲:在Python中使用正则表达式的split()方法分割字符串详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中使用正则表达式的split()方法分割字符串详解>. 使用正则表达式分割字符串 在Python中使用正则表达 ...

  6. python 正则式替换_python 正则表达式参数替换实例详解

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python ...

  7. oracle身份证的正则表达式,Oracle 正则表达式实例详解

    Oracle 正则表达式实例详解 FORM开发中的按行拆分需求:拆分后的行要有规律,并按前后层次排序 需求分析如下: 现有行: 2 , 2.1 , 2.2 , 2.3 3 2.1.1,2.1.2,2. ...

  8. java正则表达式判断问号_正则表达式问号的四种用法详解

    原文符号 因为?在正则表达式中有特殊的含义,所以如果想匹配?本身,则需要转义,\? 有无量词 问号可以表示重复前面内容的0次或一次,也就是要么不出现,要么出现一次. 非贪婪匹配 贪婪匹配 在满足匹配时 ...

  9. php 零宽断言,正则表达式之零宽断言实例详解

    这篇文章主要介绍了正则表达式之零宽断言,简单介绍了零宽断言的概念.分类及php实现技巧与相关注意事项,需要的朋友可以参考下 本文实例讲述了正则表达式之零宽断言.分享给大家供大家参考,具体如下: 前言 ...

最新文章

  1. 【Spring】bean的作用域(@Scope) - singleton、prototype
  2. 这个神了,一目了然,确实好,看小姐姐用动图展示10大Git命令
  3. 教你在Linux中如何归档和备份
  4. Linux中命令配置防火墙
  5. ArcGIS for JavaScript 关于路径开发的一些记录(二)
  6. c语言作业雇人写,C语言作业的链表数据的读写
  7. oauth最后的确认按钮_spring-oauth集成cas单点登录,登陆完成进入授权页面后,按回退按钮进入404页面的问题...
  8. python2.x和3.x为什么不兼容_Python中使用AES算法(解决Python2.x和3.x下运行不兼容问题)...
  9. Map map = request.getParameterMap(); BeanUtils.populate(bean, map);对前端表单的迅速封装与判断
  10. 剑指offer之反转链表
  11. MAC版CRT使用心得
  12. 工程验收工作笔记001---系统等保级别_系统等级保护
  13. 数据挖掘项目:问答网站问题及回答数量预测(Sofa竞赛)排名:3/155
  14. 【luogu P2939 [USACO09FEB]改造路Revamping Trails】 题解
  15. 在SharePoint 2010中创建联系人Web数据库网站
  16. Hibernate实体类注解中如何忽略某些字段的映射
  17. 【Spring-IOC】bean扫描器ClassPathBeanDefinitionScanner详解
  18. 公司为什么需要自己的SAP内部顾问
  19. YOLO系列模型,yolov3-yolov7全方位对比实验参照,包括参数量Params,计算量GFLOPs,复杂度,mAP以及FPS等参照
  20. 物联网毕业设计 车牌识别系统 stm32

热门文章

  1. linux mysql5.7启动失败/tmp/mysql.sock ?
  2. Java 动态加载类
  3. 系统架构设计师 - 项目管理 - 挣值管理
  4. 前端_网页编程 Form表单与模板引擎(中)
  5. v-if v-show区别(面试题)
  6. 服务器cpu虚拟插槽,服务器更换cpu插槽
  7. 地磅称重软件源码_电脑设备器件+塔吊主吊臂+撇渣管、丝杆+地磅称重传感器+极柱触头盒弯板+批式循环谷物干燥机+升降机标准节...
  8. Qt关闭程序的时候创建json文件,再次启动时重新加载到界面上
  9. 提权命令_利用Linux文本操作命令ed进行提权
  10. c语言switch comiti,国际经济学作业复习资料第三章.docx