首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

这是小弟我从网上找的一道题,关于正则表达式方面的,怎么办

2012-01-22 
这是我从网上找的一道题,关于正则表达式方面的,怎么处理?字符串模板:String template尊敬的客户${custom

这是我从网上找的一道题,关于正则表达式方面的,怎么处理?
字符串模板:  
  String template="尊敬的客户${customerName}你好!本次消费金额${amount},您帐户${accountNumber}上的余额为${balance}";  
其中以 ${ 开始 } 结尾的为待替换的变量域。  
数据存放于Map中,key为域名,value为域值。如:  
Map--  
  customerName = 刘明  
  accountNumber = 888888888888888  
  balance = $1000000000000000000000.00  
  amount = $5000.00  
请编写函数:  
  public static String composeMessage(String template, Map data) throw Exception  
实现将任意模板字符串中的变量域,按域名替换为data中的域值。  
例如,上例替换结果为:  
  "尊敬的客户刘明你好!本次消费金额$5000.00,您帐户888888888888888上的余额为$1000000000000000000000.00"  
注:如果Map中找不到域值,以空字符串""替换。 

下面的代码试我写的

Java code
    public static String composeMessage(String template, Map data) throws Exception     {        String regex = "\\$|\\{([^}]*)\\}";        Pattern pattern = Pattern.compile(regex);        Matcher matcher = pattern.matcher(template);        StringBuffer sb = new StringBuffer();        while(matcher.find())        {            String name = matcher.group(1);            String value =(String)data.get(name);                        if(value==null)                value="";            else                value = value.replaceAll("\\$", "¥");//这句不加的话appendReplacement()这个方法回将$翻译成组            matcher.appendReplacement(sb,value);        }        matcher.appendTail(sb);        return sb.toString();    }


问题出现在appendReplacement 
public Matcher appendReplacement(StringBuffer sb, 
 String replacement) 
这个方法里有这样的声明: 
注意,在替换字符串中使用反斜线 (\) 和美元符号 ($) 可能导致与作为字面值替换字符串时所产生的结果不同。美元符号可视为到如上所述已捕获子序列的引用,反斜线可用于转义替换字符串中的字面值字符。  
可是这道题替换的部分偏偏就含有$,怎么解决?(上面的不算方法)



[解决办法]
问题还是处在$字符上,当你的钱数前面有$是,它认为$为取匹配的组
Java code
import java.util.HashMap;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Te {    public static void main(String args[]) {        HashMap<String, String> data = new HashMap<String, String>();        String template = "尊敬的客户${customerName}你好!本次消费金额${amount},您帐户${accountNumber}上的余额为${balance}";        data.put("customerName", "刘明");        data.put("accountNumber", "888888888888888");        data.put("balance", "$1000000000000000000000.00");        data.put("amount", "$5000.00");        try {            System.out.println(composeMessage(template, data));        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        data = null;        template = null;    }    public static String composeMessage(String template, Map data)            throws Exception {        String regex = "\\$|\\{([^}]*)\\}";        Pattern pattern = Pattern.compile(regex);        Matcher matcher = pattern.matcher(template);        StringBuffer sb = new StringBuffer();        while (matcher.find()) {            String name = matcher.group(1);            String value = (String) data.get(name);            if (value == null)                value = "";            else                value = value.replaceAll("\\$", "\\\\\\$");// 这句不加的话appendReplacement()这个方法回将$翻译成组            matcher.appendReplacement(sb, value);        }        matcher.appendTail(sb);        return sb.toString();    }} 

热点排行