วิธีการหลีกเลี่ยง% ใน String รูปแบบ?


445

ฉันกำลังจัดเก็บแบบสอบถาม SQL ในไฟล์ strings.xml ของฉันและฉันต้องการใช้String.Formatเพื่อสร้างสตริงสุดท้ายในรหัส SELECTคำสั่งใช้เหมือนอะไรเช่นนี้

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

เพื่อจัดรูปแบบที่ฉันแทนที่ 'บางสิ่งบางอย่าง' ด้วย% 1 $ s ดังนั้นจึงกลายเป็น:

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

ฉันหนีเครื่องหมายคำพูดเดี่ยวด้วยแบ็กสแลช อย่างไรก็ตามฉันไม่สามารถหลีกเลี่ยงเครื่องหมาย% ได้

ฉันจะรวมคำสั่ง like ในไฟล์ strings.xml ของฉันได้อย่างไร


อย่าลืมที่จะหลบหนี% s อย่างถูกต้อง
Seva Alekseyev

26
แจ้งเตือนฉีด SQL เตรียมตัว
BalusC

พวกเขาต้องการฉีดลงในฐานข้อมูลของตัวเองโดยไม่ต้องกังวลที่นี่;)
มัดธาย

7
แม้ว่ามันจะเป็นฐานข้อมูลของคุณเองก็เป็นไปได้ที่จะเขียนข้อความค้นหาที่ทำสิ่งไม่ดีโดยไม่ตั้งใจ หรือเพียงแค่เขียนแบบสอบถามที่ไม่ได้รวบรวม การเตรียมแบบสอบถามเป็นนิสัยที่ดีในการเข้าไป
Rauni Lillemets

แม้ว่ามันจะช้ากว่าที่String.format()คุณคิดว่าจะใช้MessageFormat()แทน
ccpizza

คำตอบ:



14

เพื่อเสริมวิธีแก้ไขปัญหาที่ระบุไว้ก่อนหน้าใช้:

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

1
สิ่งนี้จะแทนที่% ที่เพิ่มเป็นสองเท่า โปรดอ่านคำตอบอื่น ๆ
Toilal

1
@Toilal ทำไมทุกคนจะหนีบางสิ่งที่หนีไปแล้ว? และถ้าเขาทำทำไมไม่ทำอย่างนั้นจริง? บางทีเขาตั้งใจจะให้มีเครื่องหมายสอง% ดังนั้นรูปแบบการหลบหนีที่ถูกต้องจะเป็น '%%%%'
David Balažic

2

นี่คือการแทนที่ regex ที่แข็งแกร่งกว่าซึ่งจะไม่แทนที่ %% ที่เพิ่มขึ้นเป็นสองเท่าในอินพุต

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

-3

ต่อไปนี้เป็นตัวเลือกหากคุณต้องการหลีกเลี่ยงหลาย% ในสตริงที่มีบางส่วนถูกหลบหนีไปแล้ว

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

ในการทำให้บริสุทธิ์ข้อความก่อนที่จะส่งไปยัง 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();

สิ่งนี้ใช้ได้กับอักขระการจัดรูปแบบจำนวนเท่าใดก็ได้ดังนั้นมันจะแทนที่% ด้วย %%, %%% ด้วย %%%%, %%%%% ด้วย %%%%%% ฯลฯ ฯลฯ

มันจะปล่อยให้อักขระที่หนีไปอยู่คนเดียว (เช่น %%, %%%% ฯลฯ )


8
"ตอนนี้ฉันไม่อยากจะเชื่อเลยว่านี่ไม่ใช่ปัญหาที่แก้ไขได้ง่าย" << คุณตอบ 6 ปีหลังจากได้รับคำตอบที่ง่าย
AjahnCharles
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.