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

代码为:


代码如下:

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

这个用法在字符串中只有一个URL时,是适用的,但是如果字符串中包含多个域名,例如:


代码如下:

var str = '<img src="http://www.jb51.net/images/logo.gif">我们首页的<a href="http://www.jb51.net">链接</a>';

程序运行后去掉的内容就是第二个域名即http://www.jb51.net。这是为什么呢?

仔细查看正则表达式会发现,在使用"(\<img) "匹配了<img之后,使用“.*”匹配所有字符直到“http://”或者“https://”。请注意,正是“.*”导致了这个问题的出现,这里的“.*”就是说,一直查找和匹配,尽可能的多匹配,直到最后一个限定符,也就是说术语中的贪婪(greedy)匹配。很自然,就想到了使用非贪婪的匹配解决这个问题。把正在表达式改为:


代码如下:

//与贪婪匹配的差别就是多了一个问号“?”,贪婪".*",非贪婪".*?"
var reg1 = /(\<img)(.*?(?=(http|https)\:\/\/))((http|https)\:\/\/[^\/]*)/gim;

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

(0)

相关推荐

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

    代码为: 复制代码 代码如下: //程序目的,去掉图片路径中的域名 var str = '<img src="http://www.jb51.net/images/logo.gif">'; var reg1 = /(\<img)(.*(?=(http|https)\:\/\/))((http|https)\:\/\/[^\/]*)/gim; str.match(reg1); alert(str.replace(RegExp.$4,''); 这个用法在字符串中只有一个U

  • 正则表达式中的反向预搜索实现

    在以前的应用,大多是应用正向预搜索情况.也就是说,在查找内容的右面有特定的内容限定,例如下面的例子: var str3 = 'CPU: Intel Core2 5200; Memory: 2G;OS: Ubuntu 9.04'; var reg3 = /Memory\:\s+(.*(?=\;OS\:))/gim; str3.match(reg3); alert(RegExp.$1); //结果是2G [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] (.*(?=\;OS\:) 就是典型

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

    在以前的应用,大多是应用正向预搜索情况.也就是说,在查找内容的右面有特定的内容限定,例如下面的例子: 复制代码 代码如下: var str3 = 'CPU: Intel Core2 5200; Memory: 2G;OS: Ubuntu 9.04'; var reg3 = /Memory\:\s+(.*(?=\;OS\:))/gim; str3.match(reg3); alert(RegExp.$1); //结果是2G (.*(?=\;OS\:) 就是典型的正向预搜索,只有右面内容是";OS:

  • 正则表达式中的正向预查和负向预查实例分析

    本文实例讲述了正则表达式中的正向预查和负向预查.分享给大家供大家参考.具体分析如下: 这里先来看一个例子,再来解释什么是正向预查. 例子:有一段内容为"coming soon,going gogogo",要求把com和go查找出来.代码如下: 复制代码 代码如下: <html> <head> <script type="text/javascript"> //正向预查 function t1(){  var con = docum

  • 正则表达式中的正向预查和负向预查

    日常工作当中,大多数IDE自带的查找工作都能满足大多数需要. 加上正则匹配简直如虎添翼.匹配个邮箱,电话号什么的不在话下.有时候我们可能会遇到稍微特殊的场景. Windows 1.03 and Windows 2.0 fisrt Released in 1985 and 1987 respectively. Windows 95 and Windows 98 are the successor. Then Windows 2000 and Windows Xp Windows appeared.

  • php正则表达式中贪婪与非贪婪介绍

    一.贪婪与非贪婪 什么叫贪婪,比如说要从字符串中<td>面包一</td><td>面包二</td>吃面包,本来你只可以吃面包一,可是你贪心,于是就把第一个<td>到最后一个</td>里面的两个面包取出来了,你想多吃点,非贪婪也就是你不贪吃了,就只吃面包一. 我们来看看正则里面是怎么贪婪的 <?php $str = '<td>面包一</td><td>面包二</td>'; preg_ma

  • php中正则表达式中的特殊符号

    字符/  意义:对于字符,通常表示按字面意义,指出接着的字符为特殊字符,不作解释.  例如:/b/匹配字符'b',通过在b 前面加一个反斜杠,也就是/b/,则该字符变成特殊字符,表示  匹配一个单词的分界线.  或者:  对于几个字符,通常说明是特殊的,指出紧接着的字符不是特殊的,而应该按字面解释.  例如:*是一个特殊字符,匹配任意个字符(包括0个字符):例如:/a*/意味匹配0个或多个a.为了匹配字面上的*,在a前面加一个反斜杠:例如:/a*/匹配'a*'. 字符^  意义:表示匹配的字符必

  • 正则表达式中问号(?)的正确用法详解

    目录 1.直接跟随在子表达式后面 2.非贪婪匹配 3.非获取匹配 4.断言 参考资料: 正则表达式中“?”的用法大概有以下几种 1.直接跟随在子表达式后面 这种方式是最常用的用法,具体表示匹配前面的一次或者0次,类似于{0,1},如:abc(d)?可匹配abc和abcd 2.非贪婪匹配 关于贪婪和非贪婪,贪婪匹配的意思是,在同一个匹配项中,尽量匹配更多所搜索的字符,非贪婪则相反.正则匹配的默认模式是贪婪模式,当?号跟在如下限制符后面时,使用非贪婪模式(*,+,?,{n},{n,},{n,m})

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

    正则表达式简介 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规则)的文本. 许多程序设计语言都支持利用正则表达式进行字符串操作.例如,在Perl中就内建了一个功能强大的正则表达式引擎.正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的.正则表达式通常缩写成"regex",单数有regexp.regex,复数有r

  • Java中正则表达式的使用和详解(下)

    在上篇给大家介绍了Java中正则表达式的使用和详解(上),具体内容如下所示: 1.常用正则表达式 规则 正则表达式语法   一个或多个汉字 ^[\u0391-\uFFE5]+$  邮政编码 ^[1-9]\d{5}$ QQ号码 ^[1-9]\d{4,10}$  邮箱 ^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$  用户名(字母开头 + 数字/字母/下划线) ^[A-Za-z][A-Za-z1-9_-]+$ 手

随机推荐