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);