2017-01-19 4 views
-1

を使用しているとき、私は、次のコードを持っている:違法繰り返し例外がString.replaceAll()メソッド

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

XMLファイルには、次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<hashmap> 
    <request> 
     <username>{username}</username> 
     <password>{password}</password> 
    </request> 
</hashmap> 

これは例外をスロー:不正繰り返し。しかし、{}}文字をエスケープする方法はありません。なぜなら、それらを取得する方法は、{password}と{username}を期待通りに返すgetKey()メソッドとgetValue()メソッドであるからです。しかし、それはString replace = h.replaceValues(h.xmlToString(), hmap)行で壊れます。どんな解決策もお願いしますか? {password}をランダムな値(例えば "password1")に置き換えると、上記のコードは問題なく動作することに言及する価値があります。

答えて

6

replaceAllは、{}という特殊な意味を持つ正規表現を使用します。代わりにreplace(String, String)を使用すると、通常の文字列として扱われ、そのような問題はありません。

+3

'replaceAll()'という混乱した名前にもかかわらず、 'replace()'の "すべてではない"振る舞いを暗示していますが、実際にはreplace()はすべての置換を置き換えます。 – Bohemian

+0

'Pattern.quote(String)'への参照を追加することもできますが、正規表現を必要としないため、 'replace(String、String)'を使うほうが良い解決法でしょう。 –

+0

答えをありがとう! – Tudor

関連する問題