正则表达式中的“环顾”及现实项目运用

什么是环顾(lookaround)?

  • 环顾构造不婚配任何字符,只婚配文本中的特定位置,这一点与单词分界符b、锚点^以及$相似,然则环顾比它们越发通用,而且能够检测两侧文本。
  • 环顾的四种范例
    1)递次环顾-一定(从左至右检察文本):表达式为(?=……),婚配胜利的前提为表达式能够婚配右侧文本,比方(?=d)
    2)递次环顾-否认(从左至右检察文本):表达式为(?!……),婚配胜利的前提为表达式不能婚配右侧文本,比方(?!d)
    3)逆序环顾-一定(从右至左检察文本):表达式为(?<=……),婚配胜利的前提为表达式能够婚配左侧文本,比方(?<=d)
    4)逆序环顾-否认(从右至左检察文本):表达式为(?<!……),婚配胜利的前提为表达式不能婚配左侧文本,比方(?<!)=)

环顾在个人经历项目中的两个现实运用:

  • 团队治理中检测关于指定项目的权限:项目中我们是用相似38:1,749:0,188:1如许的字符串来存储团队平常成员关于各用户项目的权限,比方个中749代表ID为749的用户项目,冒号标记符后追随的0数字示意具有检察权限,1数字则示意兼具检察和设置权限,多个用户项目权限标记间以逗号分开,假如关于一个用户项目没有任何权限,则全部权限字符串中将不会涌现该项目ID。基础构造定了以后,那末我们个中一个相似的查找检测权限题目是,已知用户权限字符串,检测关于指定项目比方749是不是具有设置权限,在这里的题目情境实在就是检测用户权限字符串中是不是包括749:1这个子字符串。能够有以下几种处置惩罚体式格局:
    1)能够不必正则表达式,先以逗号作为分开符拆分权限字符串,能够获得一个数组,该数组每个元素为相似749:1如许的单个项目权限标记子字符串,再检测这个数组中是不是存在749:1这一元素项。
    2)婚配749:1涌现状况的正则表达式为^749:1|,749:1,进一步能够简化为(^|,)749:1(注重:一个小圈套,想一想这里假如不运用正则表达式婚配,而只运用平常字符串749:1作为要查找婚配的目的会涌现什么题目?)。
    3)应用环顾的正则表达式为(?<!\d)749:1(我们晓得D示意非数字,那末这里表达式假如修改成(?<=\D)749:1是不是能够平常事情?)。
  • 千分位花样化数值(各剖析页中各目标块数据用JavaScript举行逗号花样化):比方我们须要将数值298444215花样化为298,444,215,平常头脑是从这个数的右侧最先,每次数3位数字,假如左侧另有数字的话,就到场一个逗号。假如我们能把这类思绪直接用到正则表达式中固然很好,惋惜正则表达式平常都是从左向右事情的。不过变换下思绪,逗号应当加在“左侧有数字,右侧数字的个数正好是3的倍数的位置”,如许就能够运用环顾来处置惩罚这个题目了。开端的正则表达式为:(?<=\d)(?=(\d\d\d)+$),并连系开辟言语的replace替代功用举行全局婚配替代。(想一想这里假如去掉$效果会怎样?)遗憾的是,JavaScript不支持逆序环顾,因而假如要运用JavaScript中的正则表达式举行处置惩罚,方才的婚配正则表达式就须要修改成:(\d)(?=(\d\d\d)+$),并须要连系对捕捉型括号的反向援用$1举行全局婚配替代。
    原文作者:NoTryNoSuccess
    原文地址: https://segmentfault.com/a/1190000017862795
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞