theme: cyanosis
highlight: atom-one-dark
本文正在参加「金石计划 . 瓜分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.
暂无评论内容