比较难的正则

匹配图片地址

需求:

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如果被多次匹配, 那么它永远保留最后一次匹配.