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ফ্ল্যাগ কেস-ইনসেনসিটিভ ম্যাচের জন্য।