正则训练营 | 3.正则中的位置信息:行首尾 + 单词边界 + 环视

·  阅读 1225
正则训练营 | 3.正则中的位置信息:行首尾 + 单词边界 + 环视

本文正在参加「金石计划 . 瓜分6万现金大奖」

王志远,微医前端技术部

前言

​ 对于匹配而言,就像我们看一个人是不是自己要找的人,不只有对着画像、照片一直看这一个方法,也可以描述 TA 在什么东西的旁边、TA 面前是什么、背后是什么等等,这些位置信息在正则中同样有需求,并且有个专门的术语 -- 断言

​ 断言,即断定匹配文本的位置关系;前后的内容是什么、中止的位置在哪之类,落实下来分为三类:单词边界行的开始/结束环视

我们来逐一分析

行的开始/结束

​ 这个我们或多或少都接触过,如果我们要求匹配的内容出现在一行文本的开头或结尾,就可以使用^$进行位置界定。

​ 结合之前说的【模式】中多行模式的概念,默认处理文本会被正则当成一行进行处理,无论其是否换行,这是的开始结束就等同于文首和文末;而如果想处理多行情况,只需要改变模式为多行匹配即可,js 中语法为/reg/m

单词边界(Word Boundary)

​ 多行模式+^$可以在行的维度处理边界问题,但如果是单词,就无能为力了,如我们希望在下面文本中替换tom这个人名为jerry

tom asked me if I would go fishing with him tomorrow.
复制代码

这时如果替换的正则是/tom/ ,就会出现这种错误的替换现象

很明显,我们要的就是tom,而并不是只要包含 tom 就可以的部分,这时我们就可以使用到单词边界的概念,设定开始截止,避免出现匹配歧义。

基础概念

语法: \b

作用: 匹配到\w即【[A-Za-z0-9_]】表示范围之外的字符就中止匹配,可以理解为边界(Boundary)

实例

环视

​ 我们刚刚说了边界,包括单词和行的边界,其实边界也就是要求匹配文本的前后一定是特定的内容,只是这个特定内容对行来说是^$,对单词边界来说是$

​ 那我们把这个特定范围再灵活点,对于一段内容而言,有前后两个方向、满足或者不满足两个情况,意味着有四种情况,如下表。

总结下来其实就是:有尖括号则为左,等号肯定感叹否

练习题

​ 去掉连续的重复单词

the little cat cat2 is in the hat hat2, we like it.
复制代码

收藏成功!
已添加到「」, 点击更改