2010-12-02 6 views
2

"supplant() führt Variablensubstitution in der Zeichenfolge aus. Es durchsucht die Zeichenfolge nach Ausdrücken in {} geschweiften Klammern. Wenn ein Ausdruck gefunden wird, verwenden Sie ihn als Schlüssel für das Objekt , und wenn der Schlüssel einen String-Wert oder einen Zahlenwert hat, wird er durch den Klammerausdruck ersetzt und wiederholt. "Implementierung von "supplant" in Java

Genauer gesagt, ich versuche, some zu tun:

public static String supplant(CharSequence message, Map<String,Object> params) 

Ich versuche, einen regulären Ausdruck wie \ verwenden {([\ w] *) \} die Variablen zu erfassen und dann die Karte Nachschlag und ersetze, aber ich konnte keine Regex schreiben, die übereinstimmt ...

Wie würdest du Supplant() in Java implementieren?

Antwort

1

Was Sie beschreiben, ist häufiger Templating genannt. Es gibt viele Templating-Anwendungen und Bibliotheken, aber wenn Sie nur eine schnelle Lösung wünschen, können Sie sie einfach mit Regex implementieren.

In vielen Regex-Varianten würden Sie einen eingebauten in Rückruf oder callout Mechanismus, wie preg_replace_callback Funktion PHP verwenden oder /e und /ee Modifikatoren Perl. Java hat so etwas nicht, bietet aber die API, mit der Sie es selbst implementieren können. Hier ein Beispiel:

import java.util.*; 
import java.util.regex.*; 

public class Test 
{ 
    public static void main(String[] args) throws Exception 
    { 
    String s = "Lorem ipsum {foo} impedit civibus ei pri, legimus\n" + 
     "antiopam no {marco}, quo id everti forensibus maiestatis."; 
    Map<String,Object> p = new HashMap<String,Object>() 
    {{ 
     put("foo", "BAR"); 
     put("marco", "POLO!"); 
    }}; 
    System.out.printf("%s%n%n%s%n", s, supplant(s, p)); 
    } 

    public static CharSequence supplant(CharSequence message, Map<String,Object> params) 
    { 
    Matcher m = Pattern.compile("\\{(\\w+)\\}").matcher(message); 
    StringBuffer sb = new StringBuffer(); 
    while (m.find()) 
    { 
     m.appendReplacement(sb, ""); 
     String key = m.group(1); 
     sb.append(params.get(key).toString()); 
    } 
    m.appendTail(sb); 
    return sb.toString(); 
    } 
} 

Offensichtlich dieser Code aus lässt einige wesentliche Komponenten (vor allem die Ausnahmebehandlung), aber es zeigt die wichtigsten Punkte dieser Technik:

  1. erfassen den Inhalt innerhalb der geschweiften Klammern Klammern verwenden, dann greifen Sie darauf zu, indem Sie group(1) auf dem Matcher aufrufen.
  2. Verwenden Sie appendReplacement(sb, ""), um den Text anzufügen, der zwischen der vorherigen Übereinstimmung (falls vorhanden) und der aktuellen angezeigt wurde.
  3. Suchen Sie den Ersatz und hängen Sie ihn mit der Methode append() von StringBuffer an. (Du kannst Schritte 2 und 3 kombinieren, indem du die Ersetzungszeichenfolge als zweites Argument an appendReplacement() übergibst, aber dann musst du auf Dollarzeichen und Backslashes in der Zeichenfolge achten, die spezielle Behandlung erhalten. Dieser Weg ist viel einfacher.)
  4. Verwenden Sie appendTail(sb), um anzuhängen, was nach dem letzten Spiel übrig ist.

Mehrere Leute haben Helfer Klassen veröffentlicht, die Sie diese Art von Aufgabe lassen erreichen, ohne all diese vorformulierten Code schreiben zu müssen. Mein Favorit ist Elliott Hughes Rewriter.

2

Muss es mit diesem exakten Format arbeiten? Java hat bereits eingebaute Methoden, um Variablen in Strings zu ersetzen.

Siehe: