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

(?=Expression)
顺序肯定环视(正向前瞻),表示所在位置右侧能够匹配Expression
(?!pression)
顺序否定环视,表示所在位置右侧不能匹配Expression
(?<=pression)
逆序肯定环视(正向后顾),表示所在位置左侧能够匹配Expression
(?<!pression)
逆序否定环视,表示所在位置左侧不能匹配Expression
positive lookahead 顺序肯定环视(?=Expression)、正向前瞻(右)查找)一个向前查找的模式便是一个以?=开头的子表达式,须要匹配的文本跟在=后面,我们举一个例子来解释:当你要和你女朋友结婚,你妹纸见告你:"妈妈说,未来如果要娶我的话,你要先必须在一环路买一个150平的屋子",个中娶你媳妇,这个是你的终极目标,所谓正则匹配的末了返回的结果,但是你必须知足一个条件:150平的屋子,这个是一个提高路上的条件,如果没有,你娶你媳妇这个事情就没有希望了(没有成功匹配)
少年,努力吧,理解了这个需求,我们可以写成这个表达式
//正向前查找let reg = "要娶我的话,(?=你要先必须在一环路买一个150平的屋子)";let str = "妈妈说,未来如果要娶我的话,你要先必须在一环路买一个150平的屋子";
连续上面例子,妹纸见告你:等我们屋子装修睦,我们就搬入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}
匹配子表达式分组提取动态键值:
总结:关键字:位置匹配、环视