2011-08-13 35 views
4

我有以下格式消息格式方面更好的選擇

Select * where {{0} rdfs:label "Aruba" } limit 10 

字符串現在我想{0}一些新的文本替換,但問題是,消息格式是無法分析字符串因第一個大括號。我知道如果我使用'{'它會轉義它,但問題是我有這種類型的字符串的負載,我不能在大括號前後手動添加單引號。即使我編寫了一個函數來執行此操作,它也會轉義佔位符{0}的大括號。

是他們的消息格式更好的選擇,像ruby字符串插值。 我只想要一種方法來編寫一個字符串模板,我可以用新字符串替換某些部分

+0

現在我編碼如下:NewString = OlString.replace(「{0}」,「Value」); ...是這是一種效率低下的方法? – Priyam

+0

你說的是你有一個不是有效的MessageFormat的字符串(由於沒有非轉義的''''''字符),但是它包含MessageFormat風格的參數。這裏發佈的答案,包括您自己的答案,可能足以解決您的使用案例,但我不得不問,這些格式錯誤的字符串是如何成爲第一位的?無論創建它們的人或過程應該被期望提供有效的MessageFormat字符串(也許你應該提供一個驗證器);這是比事實之後嘗試修改字符串更可靠的解決方案。 – dimo414

回答

2

較新的Java版本具有java.util.Formatter及其類似方法printf。 (也有一些變體散佈在整個API中,比如String.format和PrintStream.printf)。

在那裏,你會寫

String some_text = "Hello"; 
String pattern = "Select * where {%s rdfs:label \"Aruba\" } limit 10"; 
String replaced = String.format(pattern, some_text); 
+0

現在我編碼像這樣:NewString = OlString.replace(「{0}」,「Value」); ...你認爲這是一種效率低下的方法嗎? – Priyam

+0

這取決於你的OIString的大小,以及你有多少這些替換。如果只有一個替代品,我認爲它與使用MessageFormat或Formatter的成本大致相同。 –

+0

如果您只想替換「{0}」,這可能比使用更智能的更有效。但是效率是重要的嗎? – maaartinus

1

通過你的方法替換的MessageFormat所有直接使用。在你的方法中,查找花括號並在將其傳遞到MessageFormat之前根據上下文替換它們。一樣愚蠢

s.replace("{", "'{'").replace("}", "'}'").replaceAll("'\\{'(\\d+)'\\}'", "{$1}") 

可以做,具體取決於你使用什麼樣的參數。

如果您關心效率,請勿使用此選項(特別是String.replaceAll)。如果您需要保留MessageFormat的權力,我的解決方案很有用。一個有效的解決方案將解析輸入字符串一次,並識別哪些大括號應引用。看看Pattern.replaceAll的源代碼,瞭解它是如何完成的。

0

如果您不確切知道使用什麼字符串,MessageFormat只是使用起來很危險。任何{}標誌的主題都會導致您無論在做什麼。這是我寫的一個小方法,因爲我立即需要它。它的效率是多少,我沒有檢查過。通常連接到數據庫的時間佔應答請求總時間的90%,所以如果某些功能有效,通常值得做。在一個僅限jvm的應用程序中,您應該更加小心......

public formatMessage(String pattern, String... replacements) { 

    for(int i = 0; i < replacements.length; i++) { 
     pattern = pattern.replace("{" + i + "}", replacements[i]); 
    } 

    return pattern; 
} 
+0

我想你是指'public String formatMessage(....'? – vegemite4me