Java replaceAll、regex和HashMap返回一个NullPointerException
我有以下代码:Java replaceAll、regex和HashMap返回一个NullPointerException,java,regex,hashmap,Java,Regex,Hashmap,我有以下代码: HashMap<String, String> hm = new HashMap<String, String>(); hm.put("title", "testTitle"); hm.put("year", "testYear"); String s = "<title> - <year>"; String result = s.replaceAll("<([^>]*)>", hm.get("$1"));
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("title", "testTitle");
hm.put("year", "testYear");
String s = "<title> - <year>";
String result = s.replaceAll("<([^>]*)>", hm.get("$1"));
HashMap hm=newhashmap();
hm.put(“标题”、“测试标题”);
hm.put(“年度”、“测试年度”);
字符串s=“-”;
字符串结果=s.replaceAll(“]*)>”,hm.get(“$1”);
问题是当我执行它时,它会返回以下异常:
线程“main”java.lang.NullPointerException中的异常位于
appendReplacement(未知源代码)位于
位于的java.util.regex.Matcher.replaceAll(未知源代码)
java.lang.String.replaceAll(未知源)
我不明白为什么,因为当单独执行时,hm.get(“title”)会起作用,那么为什么用replaceAll它就不起作用呢
提前感谢。考虑以下几行:
String result = s.replaceAll("<([^>]*)>", hm.get("$1"));
stringresult=s.replaceAll(“]*)>,hm.get(“$1”);
hm.get(“$1”)
(并返回null
,因为hm
中可能没有键等于“$1”
的条目)s.replaceAll(“]*)>”,null)
,并触发NPE一种方法是使用and和循环。重新检查语法。阅读“评估订单” 将查找键为“
$1
”的哈希表条目。它不存在,所以返回null
。此时还没有应用regexp,并且没有任何语句可以用组替换$1
线路
String result = s.replaceAll("<([^>]*)>", hm.get("$1"));
stringresult=s.replaceAll(“]*)>,hm.get(“$1”);
相当于:
String nulLValue = hm.get("$1"); // Note: $1 is not substituted.
String result = s.replaceAll("<([^>]*)>", nullValue);
String nulLValue=hm.get(“$1”);//注:不替换1美元。
字符串结果=s.replaceAll(“]*)>”,nullValue);
请看一看涉及
模式
和相关匹配器
s的各种Java示例。以下可能不是完美的或最佳的,在某些情况下可能会失败,但它适用于您的示例:
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("title", "testTitle");
hm.put("year", "testYear");
String s = "<title> - <year>";
Scanner scan = new Scanner(s);
scan.useDelimiter("<|>");
while (scan.hasNext()) {
final String token = scan.next();
final String value = hm.get(token);
if (value != null) {
s = s.replace("<" + token + ">", value);
}
}
System.out.println(s);
HashMap hm=newhashmap();
hm.put(“标题”、“测试标题”);
hm.put(“年度”、“测试年度”);
字符串s=“-”;
扫描仪扫描=新扫描仪;
scan.useDelimiter(“”);
while(scan.hasNext()){
最终字符串标记=scan.next();
最终字符串值=hm.get(令牌);
if(值!=null){
s=s.replace(“,值);
}
}
系统输出打印项次;
感谢您的回答,这似乎是最好的方法!
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("title", "testTitle");
hm.put("year", "testYear");
String s = "<title> - <year>";
Scanner scan = new Scanner(s);
scan.useDelimiter("<|>");
while (scan.hasNext()) {
final String token = scan.next();
final String value = hm.get(token);
if (value != null) {
s = s.replace("<" + token + ">", value);
}
}
System.out.println(s);