2011-02-07 18 views
3

私はプレースホルダ 正規表現は、ハッシュマップデータと私のプレースホルダを置き換えるために

Dear [[user.firstname]] [[user.lastname]] 

Message [[other.msg]] 

そして私マップ内のデータのコレクションを持っているとのテンプレートを持っている

Map data = new HashMap(); 
data.put("user.firstname","John"); 
data.put("user.lastname","Kannan");  
data.put("other.msg","Message goes here..."); 

私は、Javaを作成したいです正規表現を使用して、マップデータの値をテンプレート内の関連するプレースホルダ([[]])に置き換えます。

答えて

-1

だから、何が問題なのですか?

String text = "Dear [[user.firstname]] [[user.lastname]]"; 
for (String key : data.keySet()) { 
    String pattern = key.replace("[", "\\[").replace("]", "\\"); 
    text = text.replaceAll(pattern, data.get(key)); 
} 

注意してください。おそらく、それらを複製する必要があります。つまり、\の代わりに¥¥を書きます。ちょうどあなたのコードを数分デバッグすれば、ソリューションは準備が整いました。

9

Javaでregexを単独で使うことはできません。いくつかのロジックでそれをラップする必要があります。

public static String replaceValues(final String template, 
    final Map<String, String> values){ 

    final StringBuffer sb = new StringBuffer(); 
    final Pattern pattern = 
     Pattern.compile("\\[\\[(.*?)\\]\\]", Pattern.DOTALL); 
    final Matcher matcher = pattern.matcher(template); 
    while(matcher.find()){ 
     final String key = matcher.group(1); 
     final String replacement = values.get(key); 
     if(replacement == null){ 
      throw new IllegalArgumentException(
       "Template contains unmapped key: " 
       + key); 
     } 
     matcher.appendReplacement(sb, replacement); 
    } 
    matcher.appendTail(sb); 
    return sb.toString(); 

} 
+0

それは完璧に動作します。 –

+0

これは受け入れられた答えではありません... –

+0

@ Mr.Polywhirlはありません:-) –

4

あなたは、このための正規表現を必要な理由:

ここではあなたのためにこれを行う方法はありますか?なぜ単純にしない:

for (Map.Entry<String, String> replacement : data.entrySet()) { 
    s = s.replace("[[" + replacement.getKey() + "]]", replacement.getValue()); 
} 
1

私はこのためにappendReplacement方法を使用することをお勧めします:

Map<String, String> data = new HashMap<String, String>(); 
... 
Pattern p = Pattern.compile("\\[\\[([a-zA-Z.]+)\\]\\]"); 
Matcher m = p.matcher("Dear [[user.firstname]] [[user.lastname]]"); 
StringBuffer sb = new StringBuffer(); 
while (m.find()) { 
    String reg1 = m.group(1); 
    String value = data.get(reg1); 
    m.appendReplacement(sb, Matcher.quoteReplacement(value == null ? "" : value)); 
} 
m.appendTail(sb); 
+0

あなたは文字列を切り替えました。 Pattern.compile( "\\ [\\\\\\\\\\\\\\\\\\\\\\\\\"] ")'と 'p.matcher("親愛なる[[user.firstname]] [[user .lastname]] ")' –

+0

@Sean Patrick Floyd、訂正のおかげで、投稿する前にコードをテストする必要がありました。実際には、このスニペットはvimのキーボードショートカットにバインドされているので、パターン、文字列、および置換えを入力するだけでした。 –

関連する問題