首页 » 网站推广 » 正则环顾php技巧_正则表达式教程 4 Lookaround 环视

正则环顾php技巧_正则表达式教程 4 Lookaround 环视

访客 2024-12-01 0

扫一扫用手机浏览

文章目录 [+]

在第二章正则表达式组成中我们简单地先容了一个观点:位置匹配,他用标记要匹配文本的位置,而不是匹配文本的本身,不消费字符,相称于预定义的观点,在环视中,被匹配的文本不包含在终极返回的匹配结果里面,这被称之为不消费。

操作符

正则环顾php技巧_正则表达式教程 4 Lookaround 环视

解释

正则环顾php技巧_正则表达式教程 4 Lookaround 环视
(图片来自网络侵删)

(?=Expression)

顺序肯定环视(正向前瞻),表示所在位置右侧能够匹配Expression

(?!pression)

顺序否定环视,表示所在位置右侧不能匹配Expression

(?<=pression)

逆序肯定环视(正向后顾),表示所在位置左侧能够匹配Expression

(?<!pression)

逆序否定环视,表示所在位置左侧不能匹配Expression

positive lookahead 顺序肯定环视(?=Expression)、正向前瞻(右)查找)

一个向前查找的模式便是一个以?=开头的子表达式,须要匹配的文本跟在=后面,我们举一个例子来解释:当你要和你女朋友结婚,你妹纸见告你:"妈妈说,未来如果要娶我的话,你要先必须在一环路买一个150平的屋子",个中娶你媳妇,这个是你的终极目标,所谓正则匹配的末了返回的结果,但是你必须知足一个条件:150平的屋子,这个是一个提高路上的条件,如果没有,你娶你媳妇这个事情就没有希望了(没有成功匹配)

少年,努力吧,理解了这个需求,我们可以写成这个表达式

//正向前查找let reg = "要娶我的话,(?=你要先必须在一环路买一个150平的屋子)";let str = "妈妈说,未来如果要娶我的话,你要先必须在一环路买一个150平的屋子";

positive lookbehind 逆序肯定环视(?<=Expression) 正向后(左)查找)

连续上面例子,妹纸见告你:等我们屋子装修睦,我们就搬入150的大house吧,个中入住这个是你的终极目标(正则匹配结果),条件条件是要等新居装修睦,但这个不是我要的结果,我要的结果是搬入新家,这个便是所谓必须匹配,但是不包含在返回结果,理解了这个需求,我们可以写成这个表达式

//正向后查找let reg = "(?<=等我们屋子装修睦,)我们就搬入150的大house吧";let str = "等我们屋子装修睦,我们就搬入150的大house吧";

终极返回我们要返回的匹配结果:我们就搬入150的大house吧,少年,恭喜你,搬新家了。

其他两种

negative lookahead 顺序否定环视(?!Expression) 负向前查找neative lookbehind 逆序否定环视(?<!Expression) 负向后查找

也差不多就这种理解了。

实际利用例子

场景1:格式大金额数字成行业通用显示格式:三位一体,加千位分隔符(,)这个是一个比较经典的用法,比如土豪账户有$76,543,210这么这么多小钱钱,这是我们常见报表输出,或者银行存折账户打印金额格式,那么数据库实际存储肯定是一串数字:76543210,那么这里就可以用顺序肯定环视来办理这个问题。

const regex = new RegExp("(\\d)(?=(?:\\d{3})+$)", 'gm')const str = `76543210`;const subst = `$1,`;// The substituted value will be contained in the result variableconst result = str.replace(regex, subst);console.log('$', result);//$7,654,321

剖析下:

首先我们要匹配(3N)数字位置,肯定是从右到左打算位置,我们写出表达式:(\d{3}+)$,匹配到位置str[2]、str[5]两个位置。
我们上面的匹配位置表达式可以作为正向前瞻的条件表达式,以是我们写出了表达式:(?=(\d{3}+)$)然后我们取其表达式的前一位,并且作为捕获分组$1更换附加一个,分隔符办理问题,以是我们写出了表达式:(\d)(?=(\d{3}+)$)连续优化下:显然在我们这个需求中,捕获分组$2是不必须的,我们加上非捕获分组,以是我们写出了表达式:(\d)(?=(?:\d{3}+)$)办理问题,我们在连续下,如果数据库存储的是两位小数的字符串:76543210.00,我们有怎么优化,有兴趣的留言写出你的办理方案,如果你能办理这个需求,表示正则表达式你可以基本知足日常事情所需,恭喜出师了。

场景2:我们常常动态更换一个模板内容,自己定义一个标签模板,用动态数据添补模板内容,比如

//模板更换:reg_toutiao_4_1.test1const regex = /(?<=\{)[^\{]+(?=\})/gm;const str = `My name is {{name} ,I'm from {city}, {province}`;const subst = { "name": "Liang.Z", "city": "Chengdu", "province": "SiChuan Province" };// 更换的值将会被包含在结果变量中const result = str.replace(regex, (match, pos) => subst[match] || "");console.log('Substitution result: ', result);//Substitution result: My name is {{Liang.Z} ,I'm from {Chengdu}, {SiChuan Province}

匹配子表达式分组提取动态键值:

总结:

关键字:位置匹配、环视

标签:

相关文章

探秘北京丰台区历史与现代交织的文化胜地

丰台区,位于北京市南部,东邻朝阳区,西靠门头沟区,南与河北省交界,北与石景山区相邻。作为北京市重要的历史文化名城之一,丰台区不仅承...

网站推广 2025-02-18 阅读0 评论0

富士伺服器报警代码OF故障原因及应对步骤

伺服电机在工业生产中的应用越来越广泛。富士伺服器作为伺服电机的重要组成部分,其性能直接影响着整个系统的稳定性。在实际应用过程中,富...

网站推广 2025-02-18 阅读0 评论0

安卓手机电池技术发展之路电池续航的奥秘

智能手机已经成为我们生活中不可或缺的一部分。手机续航问题一直困扰着广大用户。作为安卓手机的核心部件,电池技术的发展显得尤为重要。本...

网站推广 2025-02-18 阅读0 评论0