上一章回顾
回顾下,通过上一章学习,我们学习术语:(非)贪婪,回溯陷阱
在第二章正则表达式组成中我们简略地介绍了一个概念:位置匹配,他用标记要匹配文本的位置,而不是匹配文本的本身,不消费字符,相当于预定义的概念,在环视中,被匹配的文本不包含在最终返回的匹配结果里面,这被称之为不消费。
操作符 | 说明 |
(?=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 variable
const result = str.replace(regex, subst);
console.log($, result);
//$7,654,321
分析下:
//模板替换:reg_toutiao_4_1.test1
const regex = /(?<={)[^{] (?=})/gm;
const str = `My name is {{name} ,Im 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} ,Im from {Chengdu}, {SiChuan Province}
匹配子表达式分组提取动态键值:
总结:
关键字:位置匹配、环视
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至123456@qq.com 举报,一经查实,本站将立刻删除。