2011-06-06 17 views
1

我想用值替換字符串中的命名參數,就像使用Python的%運算符一樣。 Spring支持與NamedParameterUtils所需的功能非常相似的功能,但由於某些原因,它與Jdbc緊密耦合,並用問號替換了這些帶參數的參數。類似Spring的NamedParameterUtils用於常規字符串處理的工具?

所以,如果我想要做":a is :b" % {"a":"Java", "b":"Beautiful"}我必須訴諸使用像Velocity這樣的重炮嗎?還是我缺少一些簡單的東西?

更新:使用梅德代碼寫我自己的簡單版本:

public static String formatSqlWithNamedParams(String sqlTemplate, Map<String, Object> params){ 
    StringWriter writer = new StringWriter(); 
    Pattern var = Pattern.compile("\\$\\{\\s*([\\w\\[\\]\\(\\)\\.]+)\\s*\\}"); 
    Matcher match = var.matcher(sqlTemplate); 
    int offset = 0; 
    while (match.find()) { 
     writer.write(sqlTemplate.substring(offset, match.start())); 
     String key = match.group(1); 
     Object val = params.get(key); 
     writer.write(val.toString()); 
     offset = match.end(); 
    } 
    writer.write(sqlTemplate.substring(offset)); 
    return writer.toString(); 
} 
+0

您特別需要命名參數,'printf'-style或'{0}是{1}'不會削減它? – serg 2011-06-06 15:31:35

+0

nope,因爲我正在構造一些相當大的字符串,並且'{0}'樣式佔位符在具有許多參數的長字符串中變得非常混亂和混亂。 – ihadanny 2011-06-07 06:23:43

回答

1

這大約需要50行代碼寫你想要什麼。

下面是一個「TrivialTemplate」的摘錄,我寫了一段時間回來,這確實非常相似的東西:

private final Pattern var = Pattern 
     .compile("\\{\\s*([\\w\\[\\]\\(\\)\\.]+)\\s*\\}"); 
private final PropertyUtilsBean bean = new PropertyUtilsBean(); 
private final Object data; 

public TrivialTemplate(Object data) { 
    this.data = data; 
} 

public void process(BufferedReader reader, PrintWriter writer) { 
    String line = null; 
    try { 
     while ((line = reader.readLine()) != null) { 
      Matcher match = var.matcher(line); 
      int offset = 0; 
      while (match.find()) { 
       writer.write(line.substring(offset, match.start())); 
       String key = match.group(1); 
       if (!isBlank(key)) { 
        Object val = bean.getNestedProperty(data, key 
          .toLowerCase()); 
        writer.write(val != null ? val.toString() : "{null}"); 
       } else { 
        writer.write("{null}"); 
       } 
       offset = match.end(); 
      } 
      writer.write(line.substring(offset)); 
      writer.println(); 
     } 
    } catch (Throwable t) { 
     throw new RuntimeException("template error", t); 
    } 
} 

我使用BeanUtils的支持任意的數據對象,但你可以很容易地把它限制到地圖。