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


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.