String.Format içinde% 'dan nasıl kaçılır?


446

Bir SQL sorgusu strings.xml dosyasında saklıyorum ve String.Formatkoddaki son dizeyi oluşturmak için kullanmak istiyorum . SELECTİfadesi bir gibi, böyle bir şey kullanır:

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

Biçimlendirmek için 'bir şey'% 1 $ s ile değiştirin, böylece olur:

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

Ters eğik çizgiyle tek tırnaktan kaçıyorum. Ancak% işaretinden kaçamıyorum.

Benzer bir ifadeyi strings.xml dosyama nasıl ekleyebilirim?


% S'den düzgün kaçmayı unutmayın.
Seva Alekseyev


Kendi veritabanlarına enjekte ediyorlardı, burada endişelenmiyorlar;)
Matthew

7
Kendi veritabanınız olsa bile, yanlışlıkla kötü şeyler yapan sorgular yazmak mümkündür. Veya sadece derlemeyen sorgular yazın. Sorgu hazırlamak, içine girmek için iyi bir alışkanlıktır.
Rauni Lillemets

Bunun yerine String.format()kullanmayı düşünebileceğinizden daha yavaş olmasına rağmen MessageFormat().
ccpizza

Yanıtlar:


927

Kaçmak için %, bunu iki katına gerekir: %%.


14

Daha önce belirtilen çözümü tamamlamak için şunu kullanın:

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

1
Bu, önceden ikiye katlanan% 'ın yerini alacaktır. Lütfen diğer cevabı okuyunuz.
Toilal

1
@Toilal Neden zaten kaçmış bir şeyden kaçasın ki? Ve eğer öyleyse, neden gerçekten yapmıyorsunuz? Belki% iki işaret almayı amaçladı, bu yüzden doğru kaçan form '%%%%' olurdu
David Balažic

2

Bu, girişte zaten iki katına çıkmış olan %% 'ın yerine geçmeyecek daha güçlü bir normal ifade.

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

-3

Bazıları zaten kaçmış bir dizede birden çok% 'den kaçmanız gerekiyorsa bir seçenek.

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

İletiyi String.format dosyasına geçirmeden önce dezenfekte etmek için aşağıdakileri kullanabilirsiniz

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();

Bu, herhangi bir sayıda biçimlendirme karakteriyle çalışır, bu nedenle% ile %%, %%% ile %%%%, %%%%% ile %%%%%% vb.

Önceden kaçan karakterleri tek başına bırakacaktır (örn. %%, %%%% vb.)


8
“Bunun şimdiye kadar basit bir çözülmüş sorun olmadığına inanamıyorum” << Basit bir çözüm kabul edildikten 6 yıl sonra cevap verdiniz.
AjahnCharles
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.