• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    正则表达式之零宽断言实例详解【基于PHP】

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

    前言

    之前我曾写了一篇关于正则表达式的文章(https://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='/(?!bc)gw/';
    $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)\w\d
    判断一个字符串是否包含一个字母加数字的组合,且其前面不是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 bcdiv和bcmul 函数的怪异现象
    • PHP危险函数禁用深入详解
    • php中使用array_filter()函数过滤数组实例讲解
    • php array_map()函数实例用法
    • PHP执行系统命令函数实例讲解
    • PHP超级全局变量、魔术变量和魔术函数汇总整理
    • python如何调用php文件中的函数详解
    • PHP中断言函数的使用详解
    上一篇:正则表达式中环视的简单应用示例【基于java】
    下一篇:判断用户输入的银行卡号是否正确的方法(基于Luhn算法的格式校验)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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