转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/119342396

本文出自 容华谢后的博客

往期回顾:

《一起学习正则表达式(一)那些让人头晕的元字符》

《一起学习正则表达式(二)量词与贪婪》

《一起学习正则表达式(三)分组与引用》

《一起学习正则表达式(四)常见的4种匹配模式》

《一起学习正则表达式(五)断言匹配》

《一起学习正则表达式(六)正则匹配原理》

《一起学习正则表达式(七)回溯陷阱》

0.写在前面

一提到断言,很多人第一时间就会想到单元测试,在正则中,断言是指对匹配到的文本位置有要求,比如我们想要查找一段文本中 tom 这个单词,但是其他单词 tomorrow 或者 tomato 也包含 tom,我们该怎么去限定呢,这就是断言大显身手的时候了。

对匹配到的文本位置有要求,其实就是限定单词左边和右边的字符类型,细想下来,其实和单元测试中的断言也差不多,正则中常见的断言有三种,分别是单词边界、行的开始和结束、环视,一起来看下。

1.单词边界

我们在第三篇文章中,学习了正则中分组与引用的知识,其中在查找那一节,我们举了一个例子,来回顾下:

有这样一个需求,在一个目标字符串中,查找两个重复出现的单词,还没有学到单词边界,我们先用 \w{2,} 来表示出现的单词,重复的单词就是 (\w{2,} \1),看下结果:

有的同学会有疑问,为什么要用 \w{2,} 来表示一个单词呢,\w+ 不行吗,来看下 \w+ 匹配的效果:

可以看到字母 s 也被匹配到了,这并不是我们想要的结果,我们需要优雅的解决这个问题,就用到了单词边界,边界的英文是 Boundary,取其首字母小写,就用 \b 来表示,可以写在单词的左边或右边,修改之后是这样的:

\b 放在单词的左边或者右边,匹配结果是不一样的:

单词 tom
单词包含 tom
\btom
以 tom 开头的单词
tom\b
以 tom 结尾的单词
\btom\b
只能是 tom
tom
tomorrow
atom
atomic

2.行的开始和结束

在前几篇文章中,我们已经对行的开始和结束标记有一些了解了,在正则中,我们使用脱字符 ^ 来表示行的开始,美元符 $ 来表示行的结尾,举个栗子:

对登录密码进行格式校验,密码要求是6位连续的数字,我们可以很快的写出正则表达式 \d{6},来验证下:

可以看到6位数字可以匹配成功,7位、8位也可以匹配成功,这显然是不对的,修改下:

和单词边界差不多,^ 限定以什么开始,$ 限定以什么结尾,只不过限定的不是单词,而是一段文本。

我们还可以使用 \A\z(Python 中使用 \Z) 来限定行的开始和结束:

注意:\A \Z 这种匹配方式是不支持多行模式的,目标字符串中也不可以有其他字符,比如换行或者空格。

3.环视

环视在正则中的意思就是左右看,也被称为零宽断言,和单词边界类似,但是更加灵活了,环视可以限定单词的左边可以是什么类型,不可以是什么类型,单词的右边可以是什么类型,不可以是什么类型:

正则 名称 含义 示例
(?<=Y) 肯定逆序环视 左边是Y (?<=\d)th 左边是数字的 th,可以匹配上 9th
(?<!Y) 否定逆序环视 左边不是Y (?<!\d)th 左边不是数字的 th,可以匹配上 health
(?=Y) 肯定顺序环视 右边是Y six(?=\d) 右边是数字的 six,可以匹配上 six6
(?!Y) 否定顺序环视 右边不是Y six(?!\d) 右边不是数字的 six,可以匹配上 sixgod

环视的正则表达式是用括号括起来的,注意这个括号不会被保存成子组,引用数括号位置的时候注意跳过。

这四个表达式,乍一看起来有点懵,其实是有规律可循的,带尖括号的看左边,不带尖括号的看右边,带叹号就是否定,这样就好记了。

我们用环视来表示下上面学到的单词边界,可以这样写 ((?<!\w)\w+(?!\w))

4.写在最后

最后在总结下上面讲到的内容:

到这里,正则表达式的断言匹配就讲完了,如果有问题可以给我留言评论,谢谢。

正则表达式在线校验工具:https://regex101.com/

一起学习正则表达式(五)断言匹配相关推荐

  1. 一起学习正则表达式(四)常见的4种匹配模式

    转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/119101667 本文出自 容华谢后的博客 往期回顾: <一起学习正 ...

  2. php正则匹配js中变量_PHP正则表达式核心技术完全详解 第12节 [附加知识] 断言匹配...

    作者:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! 极客小俊@知乎,官方首发原创文章 博客: 极客小俊GeekerJun PHP正则中的断言 ...

  3. 正则表达式学习笔记001--点号匹配

    正则表达式学习笔记001--点号匹配 以前写的课程都没有附上源码,很抱歉! 交流群1:251572072 交流群2:170933152 也可以自己下载: 正则表达式学习笔记001--点号匹配 http ...

  4. 正则表达式匹配数字或者短横杠至多三次,数字可以不填写,学习正则表达式

    先上正则表达式:^[+-]?[-]?([0-9]*\.?[0-9]*|[0-9]?\.?[0-9]*)?$ 这个表达式主要用来验证数字,如果不想填写数字的情况下可以使用---来进行代替 在实际的生产环 ...

  5. php preg_match 只匹配第一个字符_PHP正则表达式核心技术完全详解 第12节知识补充 断言匹配

    作者:极客小俊 一个专注于web技术的80后 你不用拼过聪明人,你只需要拼过那些懒人 你就一定会超越大部分人! PHP正则中的断言匹配 我遇见过很多初学者都不知道什么叫 断言匹配 ,今天就跟小白解释一 ...

  6. 学习笔记-正则表达式-用正则匹配换行和空格的坑

    (菜鸟小白总结,不喜勿入) 今天用爬了个网站,结果里面数据没用xpath提取到,感到迷惑,所以不得已用了正则表达式,要匹配的信息如下: <span class="item-compan ...

  7. Postgresql学习笔记之——模糊匹配LIKE、SIMILAR TO和POSIX正则表达式

    1.介绍 Postgresql数据库中提供三种实现模糊匹配的方式: 1.传统的SQL的LIKE操作. 2.SQL99中SIMILAR TO操作符. 3.POSIX风格的正则表达式. 另外还有一个模式匹 ...

  8. 正则表达式学习日记_《学习正则表达式》笔记_Mr_Ouyang

    正则表达式学习日记_<学习正则表达式>笔记_Mr_Ouyang 所属分类: 正则表达式学习日记  书名:     学习正则表达式 作者:     Michael Fitzgerald 译者 ...

  9. PostgreSQL学习手册(五) 函数和操作符

    PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符:     常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符:     下面是Po ...

  10. 2016-8-4学习正则表达式

    2016-8-4学习正则表达式 编程 正则 第二章 简单的模式匹配 正则表达式唯一的用途就是在文本中匹配和寻找模式 匹配字符串字面值的方法就是使用普通的字符. 第三章 边界 断言标记边界,但是并不耗用 ...

最新文章

  1. 并发编程-03线程安全性之原子性(Atomic包)及原理分析
  2. 【C++】33.二级指针 **p
  3. Linux运维:CentOS7在防火墙中添加访问端口?
  4. AutoML Challenge 历史回顾
  5. Spring框架—SpringBean源码分析
  6. 如何使用SAP CRM增强工具AET创建Table表格类型的增强
  7. uva 436 Arbitrage (II)
  8. python读取数据库数据,读取出的中文乱码问题
  9. iOS中内存管理的问题——堆和栈
  10. VC6++配置汇编环境和第一个简单程序
  11. cad工具箱详细讲解_AutoCAD学院派工具箱(XCAD)使用教程(图文解说)
  12. android 音频文件下载
  13. 短期刚需还是未来趋势? 聚焦音视频技术发展方向
  14. Robotium-基础理论介绍
  15. 常见服务的默认端口_wuli大世界_新浪博客
  16. 长期吃nmn有副作用吗,nmn产品副作用,真相说明
  17. 史上最全各类面试题汇总,没有之一,不接受反驳
  18. codeforces 283C Coin Troubles(背包DP)
  19. 利用蒙特卡洛(Monte Carlo)方法计算π值
  20. 美国国土安全部仍然使用COBOL语言

热门文章

  1. 猜数游戏(人机交互)
  2. IJCAI2022推荐系统论文集锦
  3. 敏捷开发 — Story/Defect
  4. php octet stream,php 上传excel时,excel mime-type类型为application/octet-stream,无法通过验证...
  5. 光线cms,如何增加像百度一样的智能提示
  6. 抛弃光驱,让你的U盘变光驱,制作USB-CDROM,用U盘安装系统
  7. 如何压缩视频大小?详细操作步骤
  8. springboot医院预约挂号系统在线视频点播系统毕业设计毕设作品开题报告开题答辩PPT
  9. 计算机为什么获取mac地址,电脑获取mac地址失败怎么办
  10. 远程办公和分布式协作