कैसे String.Format में% से बचने के लिए?


445

मैं अपनी String.Formatस्ट्रिंग्स. xml फ़ाइल में SQL क्वेरी जमा कर रहा हूं और कोड में अंतिम स्ट्रिंग बनाने के लिए उपयोग करना चाहता हूं । SELECTबयान एक तरह, कुछ इस तरह का उपयोग करता है:

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

स्वरूपित करने के लिए कि मैं% 1 $ s के साथ 'कुछ' को प्रतिस्थापित करता हूं इसलिए यह बन जाता है:

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

मैं बैकलैश के साथ सिंगल कोट्स से बचता हूं। हालाँकि मैं% चिन्ह से बच नहीं पा रहा हूँ।

मैं अपने स्ट्रिंग्स.xml फ़ाइल में एक विवरण कैसे शामिल कर सकता हूं?


ठीक से% s बचना मत भूलना।
सेवा अलेक्सेयेव


वे अपने स्वयं के डेटाबेस में इंजेक्शन लगा रहे हैं, यहां कोई चिंता नहीं है;)
मैथ्यू

7
ठीक है, भले ही यह आपका अपना डेटाबेस हो, गलती से खराब चीजें करने वाले प्रश्नों को लिखना संभव है। या केवल उन प्रश्नों को लिखें जो संकलन नहीं करते हैं। प्रश्नों को तैयार करना एक अच्छी आदत है।
रौनी लिलेमेट्स

हालाँकि यह String.format()आपके MessageFormat()बजाय उपयोग करने पर विचार करने की तुलना में धीमा है ।
ccpizza

जवाबों:


926

बचने के लिए %, आपको इसे दोगुना करने की आवश्यकता होगी %%:।


14

पिछले वर्णित समाधान के पूरक के लिए, उपयोग करें:

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

1
यह% को बदल देगा जो पहले से दोगुना है। कृपया अन्य उत्तर पढ़ें।
टॉइल

1
@ तोलीलाल कोई ऐसी चीज़ से क्यों बच जाएगा जो पहले से ही बच गई है? और अगर वह होता तो वास्तव में ऐसा क्यों नहीं करता? शायद वह दो% संकेत देने का इरादा रखता है, इसलिए सही बच गया फॉर्म '%%%%' होगा
डेविड बालासिक

2

यह एक मजबूत रेगेक्स रिप्लेस है जो %% को प्रतिस्थापित नहीं करेगा जो पहले से इनपुट में दोगुना है।

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 साल बाद जवाब दिया।
अजहरनहरल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.