日期:2014-05-16  浏览次数:20380 次

javascript,java 正则表达式反向引用 实际应用
一、问题描述:要将下面的字符串中的href="detail.jsp?fruit=x3&column=y5" 替换为onclick="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&amp;column=y5">
<area shape="rect" coords="699,144,719,526" title="(x2, y5) = 7" alt="" href="detail.jsp?fruit=x2&amp;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,"onclick=\"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,"onclick=\"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&amp;column=y5\" onclick=ClickChart(x3,y5)/>"+
  "<area shape=\"rect\" coords=\"699,144,719,526\" " +
  "title=\"(x2, y5) = 7\" alt=\"\" href=\"detail.jsp?fruit=x2&amp;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获得。