今天遇到的需求是把 书籍标题中简称的字符串替换为它的全称
代码如下:
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
应该是正则表达式为贪婪模式的原因。