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.