কম্পিউটার টিউটোরিয়াল

MongoDB-এ Regex ইস্কেপ (Escape) করে স্পেশ্যাল ক্যারেক্টার ম্যাচ করা

MongoDB-এ Regex-এ স্পেশ্যাল ক্যারেক্টার (যেমন /, (, ), *, +, ?, ., [, ], {, }, ^, $, |, \) লিটারাল ক্যারেক্টার হিসেবে ম্যাচ করতে হলে সেগুলো ইস্কেপ (escape) করতে হয়। MongoDB শেলে Regex লিটারেল /pattern/ ব্যবহার করলে ব্যাকস্ল্যাশ (\) দিয়ে ইস্কেপ করা হয়।

উদাহরণ: কালেকশন ও ডেটা তৈরি (স্পেশ্যাল ক্যারেক্টারসহ)

> db.demo696.insertOne({ Message: "/Good/" });
{ "acknowledged" : true, "insertedId" : ObjectId("5ea6d664551299a9f98c9391") }
> db.demo696.insertOne({ Message: "(good)" });
{ "acknowledged" : true, "insertedId" : ObjectId("5ea6d67a551299a9f98c9392") }
> db.demo696.insertOne({ Message: "/Bye/" });
{ "acknowledged" : true, "insertedId" : ObjectId("5ea6d68b551299a9f98c9393") }
> db.demo696.insertOne({ Message: "(GOOD)" });
{ "acknowledged" : true, "insertedId" : ObjectId("5ea6d693551299a9f98c9394") }

সব ডকুমেন্ট দেখানো

> db.demo696.find();

আউটপুট:

{ "_id" : ObjectId("5ea6d664551299a9f98c9391"), "Message" : "/Good/" }
{ "_id" : ObjectId("5ea6d67a551299a9f98c9392"), "Message" : "(good)" }
{ "_id" : ObjectId("5ea6d68b551299a9f98c9393"), "Message" : "/Bye/" }
{ "_id" : ObjectId("5ea6d693551299a9f98c9394"), "Message" : "(GOOD)" }

Regex দিয়ে "good" (কেস-ইনসেনসিটিভ) ম্যাচ করা

> db.demo696.find({ Message: /good/i });

এখানে /good/i — "good" শব্দটি কেস-ইনসেনসিটিভভাবে কোথাও থাকলে ম্যাচ করবে। স্ল্যাশ (/) এবং প্যারেনথেসিস ((, )) লিটারাল ক্যারেক্টার হিসেবে আছে, Regex মেটা-ক্যারেক্টার নয়, তাই ইস্কেপ লাগেনি।

আউটপুট

{ "_id" : ObjectId("5ea6d664551299a9f98c9391"), "Message" : "/Good/" }
{ "_id" : ObjectId("5ea6d67a551299a9f98c9392"), "Message" : "(good)" }
{ "_id" : ObjectId("5ea6d693551299a9f98c9394"), "Message" : "(GOOD)" }

"/Bye/" ম্যাচ করেনি।

Regex ইস্কেপ করার নিয়ম

ক্যারেক্টারRegex-এ অর্থইস্কেপ (লিটারাল ম্যাচ)
.যেকোনো ক্যারেক্টার\.
*০ বা অধিকবার\*
+১ বা অধিকবার\+
?০ বা ১ বার\?
^শুরু\^
$শেষ\$
[ ]ক্যারেক্টার ক্লাস\[ \]
{ }কোয়ান্টিফায়ার\{ \}
( )গ্রুপিং\( \)
|OR\|
\ইস্কেপ ক্যারেক্টার\\
/Regex ডিলিমিটার (শেলে)\/

প্রোগ্রাম্যাটিক্যালি Regex বিল্ড করা (ইস্কেপ ফাংশন)

যদি ইউজার ইনপুট থেকে Regex বানান, তবে স্পেশ্যাল ক্যারেক্টার ইস্কেপ করতে হবে:

function escapeRegex(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}
// ব্যবহার:
var userInput = "(good)";
var regex = new RegExp(escapeRegex(userInput), 'i');
db.demo696.find({ Message: regex });

মূল পয়েন্টসমূহ

  • MongoDB শেলে /pattern/ সিনট্যাক্সে \ দিয়ে ইস্কেপ করুন।
  • $regex অপারেটর ব্যবহার করলে স্ট্রিংয়ের ভেতরে \\ (ডাবল ব্যাকস্ল্যাশ) দরকার (JSON/JS স্ট্রিং ইস্কেপ)۔
  • ইউজার ইনপুট থেকে Regex বানালে অবশ্যই ইস্কেপ ফাংশন ব্যবহার করুন (ReDoS আটাক প্রতিরোধেও সহায়ক)۔
  • i ফ্ল্যাগ কেস-ইনসেনসিটিভ ম্যাচের জন্য।
  1. MongoDB-তে প্রজেক্ট ফিল্ড ব্যবহার করা

  2. MongoDB-এ ({$natural: 1}) সর্ট অর্ডার বোঝা

  3. MongoDB-তে find()-এ প্রজেকশন দিয়ে _id ফিল্ড হাইড করা

  4. MongoDB-এ মাস ইন্সারশন (insertMany)