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

 在前面《正则表达式中的反向预搜索》

中,在JavaScript中利用RegExp对象实现了正则表达式反向预搜索的字符串替换功能,代码为:

//程序目的,去掉图片路径中的域名
var str = '<img src="http://news.163.com/sports/yao.jpg">';
var reg1 = /(/<img)(.*(?=(http|https)/:////))((http|https)/:////[^//]*)/gim;
str.match(reg1);
alert(str.replace(RegExp.$4,'');

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

var str = '<img src="http://news.163.com/sports/yao.jpg">网易首页的<a href="http://www.163.com">链接</a>';

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

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

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

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

时间: 2024-10-24 04:23:20

正则表达式中的反向预搜索(续)的相关文章

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

在以前的应用,大多是应用正向预搜索情况.也就是说,在查找内容的右面有特定的内容限定,例如下面的例子: 复制代码 代码如下: 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:

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

在以前的应用,大多是应用正向预搜索情况.也就是说,在查找内容的右面有特定的内容限定,例如下面的例子: 复制代码 代码如下: 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:

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

在以前的应用,大多是应用正向预搜索情况.也就是说,在查找内容的右面有特定的内容限定,例如下面的例子: 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/:))/

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

代码为: 复制代码 代码如下: //程序目的,去掉图片路径中的域名 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

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

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

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

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

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

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

浅析正则表达式中的lastIndex以及预查

依次写出下列输出内容. var reg1 = /a/; var reg2 = /a/g; console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg2.test('abcabc')); //