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

在以前应用大多是应用正向预搜索情况也就是说在查找内容右面有特定内容限定例如下面例子:
点击运行可以看到效果:
[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]

(.*(?=\;OS\:) 就是典型正向预搜索只有右面内容是“;OS: ”才会被匹配到
但是现在要实现效果左面内容是固定而不是右面可是JavaScript并不支持反向预搜索我相信细心朋友已经发现了其实上面例子已经达到了这个目(前面Memory\:\s+ 限定了左面内容)下面再给出个例子:
复制代码 代码如下:

//去掉图片路径中域名
var str = '<img src="http://s.163.com/sports/yao.jpg" src="http://s.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 RegExpTest {
public void (String args){
Pattern p = Pattern.compile("((?<=\\<img.*(?=(http|https)))(http|https))");
Matcher matcher = p.matcher("<img src="http://s.163.com/sports/yao.jpg" src="http://s.163.com/sports/yao.jpg"/>");
.out.prln(matcher.matches);
}
}


本身应该没有什么问题但是运行结果:
Exception in thread "" 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); //称


敏捷开发思想说:代码是最好文档给了我借口呵呵
Tags:  正则表达式反向

延伸阅读

最新评论

发表评论