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

在以前的应用,大多是应用正向预搜索情况。也就是说,在查找内容的右面有特定的内容限定,例如下面的例子:

复制代码 代码如下:

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: ”才会被匹配到。

但是现在要实现的效果,左面的内容是固定,而不是右面。可是JavaScript并不支持反向预搜索。我相信,细心的朋友已经发现了,其实上面的例子已经达到了这个目的(前面的Memory\:\s+ 限定了左面的内容)。下面再给出一个例子:

复制代码 代码如下:

//程序目的,去掉图片路径中的域名

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,''));

那么到底有没有反向预搜索呢?答案是肯定的,可是现实是残酷的。我查阅了一些资料,上面提到反向预搜索的形式是以?<= 或者?<! 为引导的。遗憾的是JavaScript并不支持,在高版本的Java中已获支持,于是就编写了下面的测试程序(JRE1.6.0_03):

复制代码 代码如下:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegExpTest {

    public static void main(String[] args){

        Pattern p = Pattern.compile("((?<=\\<img.*(?=(http|https)))(http|https))");

        Matcher matcher = p.matcher("<img src="http://news.163.com/sports/yao.jpg"/>");

        System.out.println(matcher.matches());

    }

}

程序本身应该没有什么问题,但是运行结果:

Exception in thread "main" java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index 27

((?<=\<img.*(?=(http|https)))(http|https))

我Google了半天,最后得到的唯一结果就是换种写法。希望看到这篇文章的朋友,如果已经实现了这种效果,一定要留言不吝赐教。

另外,在我看文档时看到了?:引导的正则表达式,上面说是“匹配不存储”,百思不得其解。感觉还是代码来的实在,写一个看一下:

复制代码 代码如下:

var str2 = '客户端名称';

var reg2 = /(客户端名(?:称)?)/;

str2.match(reg2);

alert(RegExp.$1); //客户端名称

alert(RegExp.$2); //空字符串

//不使用?:

reg2 = /(客户端名(称)?)/;

str2.match(reg2);

alert(RegExp.$1); //客户端名称

alert(RegExp.$2); //称

敏捷开发思想说:代码是最好的文档。给了我借口,呵呵。

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

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

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

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

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

 在前面<正则表达式中的反向预搜索> 中,在JavaScript中利用RegExp对象实现了正则表达式反向预搜索的字符串替换功能,代码为: //程序目的,去掉图片路径中的域名 var str = '<img src="http://news.163.com/sports/yao.jpg">'; var reg1 = /(/<img)(.*(?=(http|https)/:////))((http|https)/:////[^//]*)/gim; str.m

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

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

activex-delphi 开发了一个ACTIVEX打印控件,在VS2010 中调试正常预览,发布后到IIS上却不行了

问题描述 delphi 开发了一个ACTIVEX打印控件,在VS2010 中调试正常预览,发布后到IIS上却不行了 请各位大侠帮忙指点: delphi 开发了一个ACTIVEX打印控件直接一个OCX文件,在VS2010 中调试正常预览,发布后到IIS上却不行了,不知道什么问题.查好多网上的资料各种说法试过也不行,也制作了一个测试的数字签名,大侠们帮忙啊. 谢谢.... 解决方案 我的做法是引用命名后... ActiveFormX SS = new ActiveFormX(); 解决方案二: 碰到