2017-01-03 2 views
0

Ich habe eine kleine api eine Zeichenfolge in einer anderen Zeichenfolge zu konvertieren, indem Eigenschaft Inhaber zu aktualisieren (Muster {{property_name}}Java ersetzen Unterkette (Muster) von einem anderen Unterkette (Wert) Ausgabe

Hier mein Versuch:..

public class TestApp { 

    public static void main(String[] args) { 
     Map<String, String> props = new HashMap<>(); 
     props.put("title", "login"); 

     String sourceTitle = "<title>{{ title }}</title>"; 
     System.out.println(updatePropertyValue(sourceTitle, props)); 

     // Print: <title>login</title> 

     // ERROR if 
     props.put("title", "${{__messages.loginTitle}}"); 
     System.out.println(updatePropertyValue(sourceTitle, props)); 
     // Expected: <title>${{__messages.loginTitle}}</title> 

     // Exception: 

     // Exception in thread "main" 
     // java.lang.IllegalArgumentException: named capturing group has 0 length name 
     // at java.util.regex.Matcher.appendReplacement(Matcher.java:838) 
    } 

    static String updatePropertyValue(String line, Map<String, String> properties) { 
     for (Entry<String, String> entry : properties.entrySet()) { 
      String holder = "\\{\\{\\s*" + entry.getKey() + "\\s*\\}\\}"; 
      line = Pattern.compile(holder, Pattern.CASE_INSENSITIVE) 
          .matcher(line).replaceAll(entry.getValue()); 
     } 
     return line; 
    } 
} 

Es funktioniert gut, wenn der Wert der Eigenschaft keine Sonderzeichen, haben nicht wie $

Gehen Sie davon aus, dass die Eigenschaftsschlüssel enthalten Buchstaben nur

Irgendeine Lösung? Vielen Dank!

+0

Haben Sie sich die [Dokumentation der 'replaceAll' Methode] angeschaut (https://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#replaceAll (java. lang.String))? Vor allem, was es über Dollarzeichen sagt? – RealSkeptic

+0

@RealSkeptic: Ja, ich habe es mir angesehen. Was ich brauche, ist, dass es eine andere Lösung dafür gibt. Vielen Dank! – Loc

+1

Verwenden Sie '.replaceAll (entry.getValue(). Replace (" $ "," \\ $ "))' 'in der' updatePropertyValue' Methode. –

Antwort

0

Ich denke, Sie müssen Regex Flucht entry.getKey() Teil. This sollte dabei helfen.

+0

Es gibt kein Problem mit entry.getKey(). Es gibt ein Problem mit entry.getValue() - Eigenschaftswert. – Loc

+0

Beachten Sie, dass die Ersetzung auch maskiert werden sollte, nicht nur das Muster. –

Verwandte Themen