距离弄懂正则的环视,你只差这一篇文章

环视.png

上一篇文章《正则表达式匹配素数的原理讲解》写完以后,一些同窗给我留言说对于正则表达式的环视不是很理解;但愿我可以讲解一下关于环视部分的内容。那么这篇文章的目的就是帮助你们理解什么是环视,环视有什么做用,以及在实际的开发中的一些例子。相信阅读本文以后,你们对于正则的环视会有更深刻的理解。前端

正则表达式的环视是什么

环视顾名思义就是环顾四周,向左看看向看看,找一个合适的位置。环视匹配的是一个位置而不是字符,这点尤其重要。git

那么咱们是怎么找到这个合适的位置的呢?固然是根据环视里面包含的条件去寻找这个位置。接下来我会用生活中的一些场景来解释每一种环视。github

确定的顺序环视

假如你如今是一名叫张三的学生,如今是体育课须要你们排个队,你记性很差忘记了本身以前的位置,可是你还记得你的后面是李四。因此这个时候你确定先找到李四,而后站在他的前面就能够了。因此你这个选择背后的逻辑是,我站的这个位置后面须要是李四才能够,咱们能够用下面这个图来表示你的选择。正则表达式

(?=李四)

若是咱们使用正则表达式来表示这个位置的话,那就是(?=李四),这就表示了你想要找的位置。app

首先解释一下什么是顺序环视,什么是逆序环视。由于正则表达式的匹配过程是从左到右的,因此若是咱们要判断一个位置的右边满不知足某个条件,这就叫顺序环视。若是咱们判断一个位置的左边满不知足某种条件的话,这就叫作逆序环视。学习

你可能会以为上面这个正则表达式有点难记,首先咱们须要知道环视都是以(?做为开头的,而后接下来的一到两个符号代表是那种环视,再而后就是须要知足的条件,最后是一个)表示结束。(?=条件)能够这样理解,?表示疑问,=表示是否知足匹配。也就是当前位置是否知足给出的条件。spa

咱们来实践一下吧,假如b表示李四,你可否找出张三须要站的位置呢?3d

(?=b)

否认的顺序环视

假如你如今是一名叫张三的学生,如今是体育课须要你们排个队,可是你不想让李四站在你的后面,由于他老是喜欢用中性笔在你的后背上乱涂乱画😂。因此这个时候你会怎么选择位置呢?你确定先看一个位置,只要这个位置的后面不是李四就能够了。由于就算李四在你前面也无所谓,毕竟他不能画你的后背了。code

因此你作这个选择背后的逻辑是,只有你站的这个位置后面不是李四才能够。咱们能够用下面这个图来表示你的选择。blog

(?!李四)

上面这个位置能够用正则表达式(?!李四)来表示,做为程序开发者,咱们对!很熟悉,在这里也是一样的意思。表示不可以知足后面的条件。

咱们来实践一下吧,假如b表示李四,你可否找出张三须要站的位置。

(?!李四)

确定的逆序环视

假如你如今是一名叫张三的学生,如今是体育课须要你们排个队,你记性仍是很很差忘记了本身以前的位置,可是你还记得你前面是李四。因此这个时候你确定先找到李四,而后站在他的后面就能够了。因此你这个选择背后的逻辑是,我站的这个位置前面须要是李四才能够
咱们能够用下面这个图来表示你的选择。

(?<=李四)

若是咱们使用正则表达式来表示这个位置的话,那就是(?<=李四),这就表示了你想要找的位置。(?<=条件)能够这样理解,?表示疑问,<表示方向是当前位置的左边,=表示是否知足匹配。也就是当前位置的左边是否知足给出的条件。

咱们来实践一下吧,假如b表示李四,你可否找出张三须要站的位置。

(?&lt;=b)

否认的逆序环视

假如你如今是一名叫张三的学生,如今是体育课须要你们排个队,你是一个比较调皮的孩子,总喜欢在李四的后背上乱涂轮画😂。如今老师说你站在那里均可以,可是就是不可让李四站在你的前面。

这时候你该如何选择,你确定先找一个位置,而后肯定你前面不是李四就能够了。哪怕李四在你的后面,你也不可以在李四的后背上乱涂乱画了

因此你这个选择背后的逻辑是,我站的这个位置前面不可以是李四才能够。咱们能够用下面这个图来表示你的选择。

(?&lt;!李四)

若是咱们使用正则表达式来表示这个位置的话,那就是(?<!李四),这就表示了你想要找的位置。(?<!条件)能够这样理解,?表示疑问,<表示方向是当前位置的左边,!表示不匹配。也就是当前位置的左边不可以匹配给出的条件。

咱们来实践一下吧,假如b表示李四,你可否找出张三须要站的位置。

(?&lt;!b)

若是你看到得了到这里,那么你应该知道了这四种环视的表示方法,和它们表示的含义了。接下来咱们来看一下环视在实际开发中的应用吧。

环视在实际开发中的应用

数字千分位的处理

在实际的开发中,做为一个前端,常常须要把原始数据处理的美观一些,而后再展现给用户,数字的千分位添加逗号就是一个很常见的需求。

这个问题的解决方案有不少种,使用正则表达式来解决这个问题是个很不错的方案。并且这个正则表达式要使用到咱们今天学习的环视。那么咱们该怎么使用环视去解决这个问题呢?

当咱们使用正则表达式去解决问题的时候,第一件事情就是须要明确解决的是一个什么问题。对于这个问题来讲,咱们要解决的问题是匹配一些位置。什么位置?就是一个数字,从后向前数,每隔三个数字的位置,而且每一个位置的左边都须要有数字。

当咱们明确了咱们须要解决的问题以后,咱们就能够写咱们的正则表达式。首先写一个可以匹配每隔三个数字的位置。这个比较容易咱们可使用确定的顺序环视(?=\d{3})应该是咱们比较容易想到的。这个正则表示的意思就是匹配一个位置,这个位置的后面须要是三个数字。咱们能够看一下咱们匹配的结果。

(?=d{3})

知足上面条件的位置有好几个,可是有一些不是咱们想要的。好比5和6之间的位置就不是咱们想要的,可是由于这个位置后面是678,也知足咱们上面的正则表达式,因此是可以匹配的。那么咱们应该如何排除这些不想要的位置呢?

还有一个隐藏的条件,那就是咱们还须要匹配字符串的结尾。若是咱们把上面的正则表达式修改成(?=\d{3}$),这样就限定了咱们匹配的位置,这个位置的后面是三个数字,而后就是字符串的结尾。咱们看一下这个表达式的匹配结果。

(?=d{3}$)

当咱们限定了最开始匹配的位置以后,如今就找到了一个正确的位置。可是尚未达到咱们的要求,咱们还须要找到3和4之间的位置。这个时候咱们可使用量词来解决这个问题,咱们知道3和4之间的位置距离字符串的结尾有6个数字,是3的倍数,因此咱们须要可以匹配数字的个数是三、六、9等,只要是3的倍数就能够。因此咱们能够将上面的表达式修改成(?=(\d{3})+$)+做用于前面括号括起来的\d{3},表示至少须要有一个\d{3}。咱们来看一下此次表达式的匹配结果。

(?=(d{3})+$)

此次的匹配结果好像还有点问题,那就是数字的开头也被匹配了,可是这不是咱们想要的结果。那么咱们应该怎么处理呢?一些同窗可能会说,咱们只要保证每个的位置左边至少有一个数字就能够了。嗯,这个方法也是能够的,按照这个思路,咱们会写出下面的正则表达式(?<=\d)(?=(\d{3})+$)(?<=\d)是确定的逆序环视,表示当前位置的左边须要是一个数字。咱们来看一下这个正则表达式的匹配结果。

(?&lt;=d)(?=(d{3})+$)

此次这个正则表达式终于知足了咱们的需求,匹配出了正确的位置。若是你以为上面的正则表达式有点长的话,咱们还可使用\B来替换掉(?<=\d)。结果也是同样的,聪明的你知道为何吗?在文章下面留言跟你们一块儿分享你的看法吧。

关于正则表达式的环视到这里就结束啦,若是你们有什么疑问和建议均可以在这里提出来。欢迎你们关注个人公众号「关山不难越」,咱们一块儿学习更多有用的正则知识,一块儿进步。

关山不难越

相关文章
相关标签/搜索