正则表达式中的反向预搜索(下)

秋天来啦,秋天来啦;天空像一块覆盖在大地上的蓝宝石,它已经给秋风抹试得洁净而明亮。棉花笑嘻嘻的来了,它听说好朋友—秋姑娘来了,笑的咧开了嘴。玉米在房顶上唱着歌跳着舞,别提多开心了。路边两只黑色的小狗在玩耍,看它那可爱的样子,让人忍不住的笑。石榴也许太兴奋了,竟然笑破了肚皮,苹果跑着来了,当然脸蛋是红彤彤的。

代码为:

 
//程序目的,去掉图片路径中的域名
var str = '<img src="//www.haodaima.com/images/logo.gif">';
var reg1 = /(\&;img)(.*(?=(http|https)\:\/\/))((http|https)\:\/\/[^\/]*)/gim;
str.match(reg1);
alert(str.replace(RegExp.$4,'');

这个用法在字符串中只有一个URL时,是适用的,但是如果字符串中包含多个域名,例如:
 
var str = '<img src="//www.haodaima.com/images/logo.gif">首页的<a rel="nofollow noopener noreferrer" href="//www.haodaima.com">链接</a>';

程序运行后去掉的内容就是第二个域名即//www.haodaima.com。这是为什么呢? 仔细查看正则表达式会发现,在使用"(\&;img) "匹配了<img之后,使用“.*”匹配所有字符直到“http://”或者“https://”。请注意,正是“.*”导致了这个问题的出现,这里的“.*”就是说,一直查找和匹配,尽可能的多匹配,直到最后一个限定符,也就是说术语中的贪婪(greedy)匹配。很自然,就想到了使用非贪婪的匹配解决这个问题。把正在表达式改为:
 
//与贪婪匹配的差别就是多了一个问号“?”,贪婪".*",非贪婪".*?"
var reg1 = /(\&;img)(.*?(?=(http|https)\:\/\/))((http|https)\:\/\/[^\/]*)/gim;

解决问题的方法很简单,但是也说明平时工作存在的一个重要问题:程序测试不充分。

以上就是正则表达式中的反向预搜索(下)。也许世间的事,都是那么的千奇百怪,随时随刻都会发生,但你要镇静,可又能镇静得了吗?我们都是俗人,没有什么惊天动地的事情,我们只有这份爱,可又那么的叫人难猜。更多关于正则表达式中的反向预搜索(下)请关注haodaima.com其它相关文章!

您可能有感兴趣的文章
浅析golang 正则表达式

基于xpath选择器、PyQuery、正则表达式的格式清理工具详解

javascript正则表达式 限1-2位整数,或者至多含有两位小数的写法

正则表达式中的 .*? 或 .*+ 的意思

javascript正则表达式标记中/g /i /m的用法,以及实例