正则精华这个真的弄了一个小时
比较难的正则
匹配图片地址
需求:
1. 这种地址: https://i0.hdslb.com/bfs/22a94391b6e22856ca.jpg
要匹配为: 22a94391b6e22856ca.jpg
2. 第二种url, https://inews.gtimg.com/newsapp_bt/0/10040546475/1000/0,
要匹配为: gtimg.com
总之目标是匹配为最终xxx.xxx的最后一个匹配
解决:
let name='https://i0.hdslb.com/bfs/article/26cd954e1acfef6cf39f3d22a94391b6e22856ca.jpg';
//第二种url, 这个也得配上:
// let name=' https://inews.gtimg.com/newsapp_bt/0/10040546475/1000/0';
let reg=/([^./]+\.[^./]+)(?![\s\S]*\.)/im;
var r=reg.exec(name);
console.log(r);
这里介绍一下为什么这个会弄得比较久:
//一开始的思路, 这个很完美的匹配了bar4
let subject=" Don't match bar1, do not match bar2, not foobar3! right: bar4"
let match0 = subject.match(/bar[0-9](?![\s\S]*bar[0-9])/);
//这里匹配的是bar1, 这里的\1是错误的, \1=bar1, 那么真的没有bar1.
let match = subject.match(/(bar[0-9])(?![\s\S]*\1)/);
//完全一样的思路用在这里就不行了.
let name1='https://i0.hdslb.com/bfs/article/22a94391b6e22856ca.jpg';
let name2=' https://inews.gtimg.com/newsapp_bt/0/10040546475/1000/0';
//这个匹配, 正确的article/22a94391b6e22856ca.jpg, 错误的inews.gtimg
let reg2=/([^./]+\.[^./]+)(?![\s\S]*[^./]+\.[^./]+)/;
//这个不行, 正确的article/22a94391b6e22856ca.jpg, 错误的inews.gtimg, 原因是第二个形式, .前面的内容已经被第一个匹配吃掉了.
let match21 = name1.match(reg2);
let match22 = name2.match(reg2);
//[\s\S]*[^./]+, 这里的加号有问题, 因为a.b.c这种情况, 匹配第一个括号之后只剩.c了, 没有b.c这种了. 用*号就没问题了.
let reg2=/([^./]+\.[^./]+)(?![\s\S]*[^./]*\.[^./]+)/;
let match21 = name1.match(reg2);
let match22 = name2.match(reg2);
//既然是*号, 那么[\s\S]* 是等效于 [\s\S]*[^./]*, 所以简化为
let reg4=/([^./]+\.[^./]+)(?![\s\S]*\.[^./]+)/;
let match41 = name1.match(reg4);
let match42 = name2.match(reg4);
//继续放宽成这样, 也是可以的.
let reg5=/([^./]+\.[^./]+)(?![\s\S]*\.[\s\S]+)/;
let match51 = name1.match(reg5);
let match52 = name2.match(reg5);
//再放宽就是之前给出的最终方案.
let reg=/([^./]+\.[^./]+)(?![\s\S]*\.)/im;
//另一个思路: 这个也不行, 会匹配g.com和a.jpg, 因为[\s\S]*吃掉了前面的所有字符.
let reg3=/([\s\S]*([^./]+\.[^./]+))/;
let match31 = name1.match(reg3);
let match32 = name2.match(reg3);
匹配网址host
需求:
下面两个的域需要被判断为相等, 都是bilibili.格式, 也就是需要忽略端口号和顶级分类
1. https://space.bilibili.com:8080/186443421/album';
2. https://w.p.h.bilibili.cn/1851631';
解决:
var reg=/^[^:]+:[/]+([^/.]+\.)+[^/]+\//im;
var c=reg.exec(currenturl);
var r=reg.exec(e);
if(r[1]!=c[1]) {
continue;
}
这里用的的点是:
(某内容){量词}, 这个时候()就是在量词范围内的最后一次匹配
这里的理由就是, group如果被多次匹配, 那么它永远保留最后一次匹配.