百科狗-知识改变命运!
--

断言(前瞻后瞻) - php 表达式

乐乐12个月前 (11-21)阅读数 21#技术干货
文章标签断言

断言(前瞻后瞻)

一个断言就是一个对当前匹配位置之前或之后的字符的测试,它不会实际消耗任何字符。简单的断言代码有\b\B\A\Z\z^$等等。更加复杂的断言以子组的方式编码。它有两种类型:前瞻断言(从当前位置向前测试)和后瞻断言(从当前位置向后测试)。

前瞻断言

一个断言子组的匹配还是通过普通方式进行的,不同在于它不会导致当前的匹配点发生改变。

  • 前瞻断言中的正面断言以?=开始,断言此匹配为真
  • 前瞻断言中的消极断言以?!开始。

比如,\w+(?=;)匹配一个单词紧跟着一个分号(;),但是匹配捕获的最终结果中不会包含分号foo(?!bar)匹配所有后面没有紧跟“bar”的“foo”字符串。

注意:一个类似的模式(?!foo)bar,它不能用于查找之前出现所有不是“foo”的“bar”匹配,它会查找到任意的“bar”出现的情况,因为(?!foo)这个断言在接下来三个字符时“bar”的时候是永远都TRUE

后瞻断言

  • 后瞻断言中的正面断言以?开始。

比如,(?用于查找任何前面不是“foo”的“bar”。

匹配固定长字符串

后瞻断言的内容被严格限制为只能用于匹配定长字符串。但是,如果有多个可选分支,它们不需要拥有相同的长度。比如(?

在最上级分支可以匹配不同长度的字符串是允许的。相比较于 perl 5.005 而言,它会要求多个分支使用相同长度的字符串匹配。(?(?

这种情况下,第一个断言查看(当前匹配点)前面的 6 个字符,检查前三个是数字,然后第二个断言检查(当前匹配点)前三个字符不是“999”。

任意复杂度嵌套

断言可以以任意复杂度嵌套。比如(?(?

不捕获子组内容,仅仅是预览

断言子组时非捕获子组,并且不能用量词修饰,因为对同一件事做多次断言是没有意义的。如果所有的断言都包含一个捕获子组,那么为了在整个模式中捕获子组计数的目的,它们都会被计算在内。然而,子字符串的捕获仅可以用于正面断言,因为对于消极的断言是没有意义的。通俗的讲,它不匹配字符串,而是匹配一个位置。

将断言计算在内,可以拥有的最大子组数量是 200 个。

匹配不包含字符串的写法

比如匹配不包含字符串ab的行写法就应该如下:

  1. 首先写下(?!ab),意思是匹配一个位置,该位置后面没有ab。
  2. 其次写出(?!ab).,意思就是该位置后面可以跟任何一个字符(除了ab),但这个正则表达式只匹配单个字符,因此该模式匹配某个位置后的单个字符,该字符是a且后面是b,否则该字符就得不到匹配。
  3. 再次写出((?!ab).)*,意思是零次或者多次的匹配。

如果匹配不包含ab的某一行的话,就是如下写法:^((?!ab).)*$

断言(前瞻后瞻) - php 表达式

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)