替换开头单词

今天遇到的需求是把 书籍标题中简称的字符串替换为它的全称

代码如下:


import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class MapTest {
  public static void main(String[] arg){
	  Map<String, String> map = new HashMap<String, String>();
	  map.put("Sa", "Saber");
	  map.put("La", "Lancer");
	  map.put("Ar", "Archer");
	  map.put("Ri", "Rider");
	  String str ="Sa1:1";
	  
	  String[] key = map.keySet().toArray(new String[0]);
	  for(int i =0 ; i<key.length;i++){
		  Pattern p = Pattern.compile(key[i]);
		  Matcher m =p.matcher(str);
		  if(m.lookingAt()){
			  System.out.println(m.replaceAll(map.get(key[i])));
		  }
	  }
	 
  }
}

思路:简称在不同书籍版本中不一样,给每个版本写一个字典文档 (简称:全称)。

                读取相对应的文档放入一个map表中。

                替换时,先列举所有的简称, 与传入的标题一一进行拼配。

               匹配成功,则替换成相对应的value。

遇到的问题一:列举map表中Key值,使用 String[] key = (String[]) map.keySet().toArray();时爆出类型转换异常

                            Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object;
    at MapTest.main(MapTest.java:16)

                             原因:应该先指定一个新数组,而不是直接等于给数组key。

问题二: 使用m.matches()时无论如何也替代不了。

                原因:m.matches() 为精确匹配, 也就是只有 String str= "Sa";   才会返回true.

                刚好标题是以key值开头,可以使用m.lookAt();

               注:若 String str="Sa1:1Sa ";  替换结果为Saber1:1Saber
               应该是正则表达式为贪婪模式的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值