使用String.replaceAll()方法时出现非法重复异常

Tud*_*dor -1 java regex

我有以下代码:

    public String replaceValues(String string, HashMap hashMap){
    TestHashMap h = new TestHashMap();
    String str = new String(h.xmlToString());
    Iterator iterator = hashMap.entrySet().iterator();
    while(iterator.hasNext()){
        HashMap.Entry pair = (HashMap.Entry)iterator.next();
        str = str.replaceAll(pair.getKey().toString(), pair.getValue().toString());
    }
    return str; 
}

public static void main(String[] args) {
    TestHashMap h = new TestHashMap();
    HashMap<String, String> hmap = new HashMap<String, String>();
    hmap.put("{username}", "Tudor");
    hmap.put("{password}", "Tester123");
    System.out.println(hmap);
    String replace = h.replaceValues(h.xmlToString(), hmap);
    System.out.println(replace);
}
Run Code Online (Sandbox Code Playgroud)

XML文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<hashmap>
    <request>
        <username>{username}</username>
        <password>{password}</password>
    </request>
</hashmap>
Run Code Online (Sandbox Code Playgroud)

抛出异常:非法重复.但是我没有办法逃避"{}"字符,因为我得到的方法是使用getKey()和getValue()方法,它按预期返回{password}和{username}.然而它打破了String replace = h.replaceValues(h.xmlToString(), hmap).有解决方案吗?值得一提的是,如果我用随机值替换{password}(例如"password1"),上面的代码可以正常工作.

Kay*_*man 6

replaceAll方法使用正则表达式,与{}具有特殊的意义.如果你使用replace(String, String)它们,它们被视为正常的字符串,并且没有这样的问题.

  • 尽管令人困惑的名称`replaceAll()`暗示`replace()`的"并非所有"行为,`replace()`实际上会替换所有出现的行为. (3认同)