2011-02-16 84 views
274

我在我的strings.xml文件中存儲了一個SQL查詢,我想用String.Format來構建代碼中的最終字符串。該SELECT語句使用了像,像這樣:如何在String.Format中轉義%?

SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE '%something%' 

爲了格式,我代替「東西」%1 $ S,使其成爲:

SELECT Field1, Field2 FROM mytable WHERE Field1 LIKE \'%%1$s%\' 

我逃避單引號與反斜槓。但是我無法逃避%符號。

如何在我的strings.xml文件中包含一個類似的語句?

+0

不要忘記正確地轉義%s。 – 2011-02-16 02:45:07

+15

[SQL注入警報](http://unixwiz.net/techtips/sql-injection.html)。 [準備自己](http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html)。 – BalusC 2011-02-16 02:45:50

+0

他們會注入自己的數據庫,這裏沒有關注;) – Matthew 2011-02-16 03:06:41

回答

602

要逃脫%,您需要將其加倍:%%

10

爲了補充前面所述的解決方案,使用:

str = str.replace("%", "%%"); 
1

這是一個更強有力的正則表達式替換不會取代了在輸入了一倍%%。

str = str.replaceAll("(?:[^%]|\\A)%(?:[^%]|\\z)", "%%"); 
0

我不能相信這不是一個簡單的問題解決了現在,但是,嘿,這是我捅它

(?:[^%]|^)(?:(%%)+|)(%)(?:[^%]) 

爲了將它傳遞給之前的String.format消毒消息,你可以使用下面的

Pattern p = Pattern.compile("(?:[^%]|^)(?:(%%)+|)(%)(?:[^%])"); 
Matcher m1 = p.matcher(log); 

StringBuffer buf = new StringBuffer(); 
while (m1.find()) 
    m1.appendReplacement(buf, log.substring(m1.start(), m1.start(2)) + "%%" + log.substring(m1.end(2), m1.end())); 

// Return the sanitised message 
String escapedString = m1.appendTail(buf).toString(); 

請注意,這適用於任何數字格式的字符,所以它會用%%代替%,%%%與%%%%,%%%%%與%% %%%%等。

它會留下任何已經逃過的字符(例如, %%,%%%%等)