স্ট্রিং.ফোর্মে% কীভাবে পালানো যায়?


445

আমি আমার স্ট্রিং.এক্সএমএল ফাইলে একটি এসকিউএল কোয়েরি সঞ্চয় করছি String.Formatএবং কোডে চূড়ান্ত স্ট্রিংটি তৈরি করতে আমি ব্যবহার করতে চাই । SELECTবক্তব্য মতো ভালো কিছু ব্যবহার করে:

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

ফর্ম্যাট করার জন্য যে আমি '1' কে% 1 $ s এর সাথে প্রতিস্থাপন করেছি যাতে এটি হয়ে যায়:

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

আমি ব্যাকস্ল্যাশ দিয়ে একক উদ্ধৃতি এড়ানোর। তবে আমি% চিহ্ন থেকে বাঁচতে পারছি না।

আমি আমার স্ট্রিংস.এমএমএল ফাইলটিতে কীভাবে একটি বিবৃতি অন্তর্ভুক্ত করতে পারি?


% S সঠিকভাবে পালাতে ভুলবেন না।
— সেবা আলেক্সিয়েভ


তারা তাদের নিজস্ব ডেটাবেসে ইনজেকশন দিবে, এখানে কোনও উদ্বেগ নেই;)
— ম্যাথু

7
ভাল, এটি আপনার নিজের ডাটাবেস হলেও, দুর্ঘটনাক্রমে খারাপ কাজগুলি করে এমন প্রশ্নগুলি লেখা সম্ভব। অথবা কেবল এমন প্রশ্নগুলি লিখুন যা সংকলন করে না। প্রবেশের জন্য ক্যোয়ারী প্রস্তুত করা ভাল অভ্যাস।
— রুনি লিলিমেটস

যদিও এটি String.format()ব্যবহারের MessageFormat()পরিবর্তে আপনি বিবেচনা করতে পারেন তার চেয়ে ধীর ।
— সিসিপিজ্জা

উত্তর:


926

অব্যাহতি %, আপনি এটি দ্বিগুণ আপ করতে হবে: %%।


14

পূর্বের বর্ণিত সমাধানটির পরিপূরক করতে, ব্যবহার করুন:

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

1
এটি ইতিমধ্যে দ্বিগুণ হওয়া% কে প্রতিস্থাপন করবে। দয়া করে অন্য উত্তরটি পড়ুন।
— তোয়ালাল

1
@ তোইলাল ইতিমধ্যে যে কেউ পালিয়ে গেছে এমন কিছু কেন পালাতে পারে? এবং তিনি যদি, আসলে এটি না কেন? হতে পারে তার দু'টি লক্ষণ থাকতে পারে, তাই সঠিক পালানো ফর্মটি '%%%%' হবে
— ডেভিড

2

এটি একটি শক্তিশালী রেজেক্স প্রতিস্থাপন যা ইতিমধ্যে ইনপুটটিতে দ্বিগুণ হওয়া %% প্রতিস্থাপন করবে না।

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

-3

আপনার যদি ইতিমধ্যে কয়েকজন পালিয়ে গিয়ে স্ট্রিংয়ে একাধিক% এর পালাতে হয় তবে এখানে একটি বিকল্প রয়েছে।

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

বার্তাটি স্ট্রিং.ফোর্মেটে যাওয়ার আগে স্যানিটাইজ করতে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন

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 বছর পরে আপনি উত্তর দিয়েছিলেন।
— অজাহানচারেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.