javascript,java 正则表达式反向引用 实际应用

一、问题描述:要将下面的字符串中的href="detail.jsp?fruit=x3&column=y5" 替换为οnclick="ClickChart('x3','y5')"

就是将x3和y5拿出来作为ClickChart的两个参数

<map id="filemap" name="filemap">
<area shape="rect" coords="731,89,751,526" title="(x3, y5) = 8" alt="" href="detail.jsp?fruit=x3&column=y5">
<area shape="rect" coords="699,144,719,526" title="(x2, y5) = 7" alt="" href="detail.jsp?fruit=x2&column=y5"/>

</map>

二、编写函数

1.javascript

//param为要处理的字符串
function buildNewString(param){
if(param == null || param.length == 0){
return "";
}

//([\s\S]*)为匹配任意字符
var reg_1 = /^([\s\S]*)href=\"([\s\S]*)fruit=(x\d)([\s\S]*)column=(y\d)\"([\s\S]*)$/;
var reg_2 = /href=\"([\s\S]*)\"/;

var arrayStr = param.split("/>");

if(arrayStr.length < 1) {
return "";
}

var resultStr = "";

//数组arrayStr最后一项为“</map>”,不处理
for(var i = 0; i < arrayStr.length-1; i ++){
reg_1.test(arrayStr[i]);
resultStr += arrayStr[i].replace(reg_2,"οnclick=\"ClickChart('" + RegExp.$3+ "','" + RegExp.$5 + "')\"") + "/>";
}
return resultStr + "</map>";
}

2.java

public static String buildNewString(String param){
if(param == null || param.length() == 0){
return "";
}

String reg_1 = "([\\s\\S]*)href=\"([\\s\\S]*)fruit=(x\\d)([\\s\\S]*)column=(y\\d)\"([\\s\\S]*)";
String reg_2 = "href=\"([\\s\\S]*)\"";

String [] arrayStr = param.split("/>");

if(arrayStr.length < 1) {
return "";
}

String resultStr = "";

//数组arrayStr最后一项为“</map>”,不处理
for(int i = 0; i < arrayStr.length-1; i ++){
//arrayStr[i].matches(reg_1);
Pattern p = Pattern.compile(reg_1);
Matcher matcher = p.matcher(arrayStr[i]);
matcher.find();
resultStr += arrayStr[i].replaceAll(reg_2,"οnclick=\"ClickChart('" + matcher.group(3) + "','" + matcher.group(5) + "')\"") + "/>";
}
return resultStr + "</map>";
}

public static void main(String[] args) {
String param ="<map id=\"filemap\" name=\"filemap\">"+
"<area shape=\"rect\" coords=\"731,89,751,526\"" +
"title=\"(x3, y5) = 8\" alt=\"\" href=\"detail.jsp?" +
"fruit=x3&column=y5\" οnclick=ClickChart(x3,y5)/>"+
"<area shape=\"rect\" coords=\"699,144,719,526\" " +
"title=\"(x2, y5) = 7\" alt=\"\" href=\"detail.jsp?fruit=x2&column=y5\"/></map>";
System.out.println(buildNewString(param));
}

三、反向引用

讲反向应用之前先讲一下分组。定义:分组是通过用一系列括号包围一系列字符、字符类以及量词来使用的。例如想匹配字符串“dogdog”。非分组的方法:var reDogDog = /dogdog/g; 但是只要匹配两次呢?

可用分组解决:var reDogDog = /(dog){2}/g;

反向引用

怎样利用分组呢?每个分组都被存放在一个特殊的地方以备后来使用,这些存储在分组中的特殊值,我们称之为反向引用(backreference)。反向引用是按照从左到右遇到的左括号字符的顺序进行创建和编号的。例如var reg_1 = /^([\s\S]*)href=\"([\s\S]*)fruit=(x\d)([\s\S]*)column=(y\d)\"([\s\S]*)$/;将从左到右产生6个反向引用

1.([\s\S]*)、2.([\s\S]*)、3.(x\d)、4.([\s\S]*)、5.(y\d)、6.([\s\S]*)

反向引用可以通过执行test(),match(),search()方法后,通过RegExp构造函数中获得。例如我们要想获得匹配(x\d)的字符可通过RegExp.$3获得。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值