js正则表达式(四):断言
?=
零宽先行断言,通俗地讲,后边是什么。可以理解为正则表达式中的条件语句。
例子:后盾人,后边是教程的加上链接
let str=`后盾人不断分享视频视频,学习后盾人教程提升编程能力`;
let reg=/后盾人(?=教程)/g;
let result;
console.log(result=str.replace(reg,'<a href="http://houdunren.com">$&</a>'));
document.body.innerHTML=result;
例子:
(?=元)这只是个条件,不会放到组里面
要跟“次”区分开
let str=`
js,200元,300次
php,300.00元,100次
node.js,180元,260次
`;
let reg=/(\d+)(\.00)?(?=元)/gim;
// 这时候用了?=元的方法
// 这里的(?=元)是不会计入分组和结果中的
console.log(str.match(reg));
console.log(str.replace(reg,function(...args){
console.log(args);
args[2] = args[2] || '.00'
return args.slice(1,3).join('')
}));
// 这是另一种方法
reg=/,(\d+)(?!\.00)元/gm;
console.log(str.match(reg));
console.log(str.replace(reg,',$1.00元'));
// 这是一个非常经典的千位符的例子
let str=`5987466214566`;
let reg=/(\d)(?=(\d{3})+$)/g;
console.log(str.replace(reg,function($1){
return $1+",";
}))
reg=/\B(?=(\d{3})+$)/g
console.log(str.replace(reg,','));
?<=
零宽后行断言,说白一点,前面是什么。这是用来判断前面的条件。
注意断言,匹配结果是看不到的,不要把它当成组。
例子:把网址全部替换成www.houdunren.com
let str=`
<a href="https://www.baidu.com">百度</a>
<a href="https://www.taobao.com">上天猫,就购了</a>
`;
let reg=/(?<=href=(['"])).+(?=\1)/gi;
console.log(str.match(reg));
console.log(str.replace(reg,'https://www.houduren.com'));
例子:把电话后4位变成****展示
let str=`
向军电话:13987673453
后盾人电话:23232128978
`;
let reg=/(?<=\d{7})\d{4}/g;
console.log(str.match(reg));
console.log(result=str.replace(reg,'****'));
?!
零宽负向先行断言,可以理解为后面不是什么。
例子:不能出现向军
例子:
?<!
零宽负向后行断言,前面不是什么。
例子:改成oss.houdunren.com
let str=`
<a href="https://www.houdunren.com/1.jpg">1.jpg</a>
<a href="https://oss.houdunren.com/2.jpg">2.jpg</a>
<a href="https://cdn.houdunren.com/3.jpg">3.jpg</a>
<a href="https://houdunren.com/3.jpg">后盾人</a>
`
let reg=/(?<=href="https:\/\/).*(?=houdunren.com)/gm
console.log(str.match(reg));
console.log(str.replace(reg,'oss.'));
// 这是教程中的做法
reg=/https:\/\/([a-z]+)?(?<!oss)\..+?(?=\/)/g
console.log(str.match(reg));
console.log(str.replace(reg,'https://oss.houdunren.com'));