🚩 أعلام التعبيرات النمطية في JavaScript: تعزيز قوة البحث النصي
بعد أن تعلمنا أساسيات إنشاء التعبيرات النمطية (Regular Expressions)، حان الوقت لنتعرف على الأعلام (Flags) التي تضيف مرونة وقوة إضافية لعمليات البحث والاستبدال التي نقوم بها.
الأعلام هي إعدادات خاصة نضيفها للتعبير النمطي لتغيير طريقة البحث. فكر فيها كمفاتيح تحكم تحدد سلوك البحث: هل يكون حساساً لحالة الأحرف؟ هل يبحث في النص كله أم يكتفي بأول نتيجة؟
🔍 ما هي أعلام التعبيرات النمطية؟
الأعلام (Flags) هي أحرف خاصة نضعها بعد الشرطة المائلة الثانية / في التعبير النمطي لتعديل سلوك البحث. لكل علم وظيفة محددة تؤثر على كيفية تنفيذ البحث.
هناك طريقتان لاستخدام الأعلام:
الطريقة الأولى: مع Literal Notation
let pattern = /search/gi; // إضافة العلمين g و i
الطريقة الثانية: مع Constructor Notation
let pattern = new RegExp('search', 'gi'); // إضافة العلمين g و i
🌟 العلم i - تجاهل حالة الأحرف (Case Insensitive)
العلم i يجعل البحث غير حساس لحالة الأحرف (Case Insensitive). هذا يعني أن البحث سيتطابق مع الأحرف الكبيرة والصغيرة بنفس الطريقة.
مثال عملي:
// بدون علم i (بحث حساس لحالة الأحرف)
let text = "Hello World, hello universe";
let pattern1 = /hello/;
console.log(text.match(pattern1)); // النتيجة: ["hello"] فقط
// مع علم i (بحث غير حساس لحالة الأحرف)
let pattern2 = /hello/i;
console.log(text.match(pattern2)); // النتيجة: ["Hello"]
في المثال الأول، وجدنا كلمة "hello" الصغيرة فقط. أما في المثال الثاني، وجدنا "Hello" الكبيرة لأن العلم i جعل البحث يتجاهل الفرق بين الأحرف الكبيرة والصغيرة.
🔄 العلم g - البحث الشامل (Global Search)
العلم g يجعل البحث يعثر على جميع التطابقات في النص، وليس فقط أول تطابق.
مثال عملي:
let text = "The cat sat on the mat. Another cat appeared.";
// بدون علم g (يجد أول تطابق فقط)
let pattern1 = /cat/;
console.log(text.match(pattern1)); // النتيجة: ["cat"]
// مع علم g (يجد جميع التطابقات)
let pattern2 = /cat/g;
console.log(text.match(pattern2)); // النتيجة: ["cat", "cat"]
لاحظ كيف أن البحث بدون علم g وجد أول كلمة "cat" فقط، بينما البحث مع العلم g وجد جميع كلمات "cat" في النص.
📄 العلم m - البحث متعدد الأسطر (Multiline Search)
العلم m يجعل الرمزين ^ و $ يتطابقان مع بداية ونهاية كل سطر، وليس فقط بداية ونهاية النص كاملاً.
مثال عملي:
let text = "First line\nSecond line\nThird line";
// بدون علم m (^ تطابق بداية النص فقط)
let pattern1 = /^Second/;
console.log(pattern1.test(text)); // النتيجة: false
// مع علم m (^ تطابق بداية كل سطر)
let pattern2 = /^Second/m;
console.log(pattern2.test(text)); // النتيجة: true
في المثال الأول، فشل البحث لأن ^ تبحث فقط في بداية النص ككل. أما مع العلم m، نجح البحث لأن ^ تبحث في بداية كل سطر.
💡 الجمع بين عدة أعلام
يمكننا الجمع بين عدة أعلام لتحقيق سلوك بحث أكثر تطوراً. نكتب الأعلام بجانب بعضها بعد الشرطة المائلة الثانية.
مثال عملي:
let text = "Hello world\nHELLO universe\nhello everyone";
// البحث عن جميع كلمات "hello" بغض النظر عن حالة الأحرف وفي جميع الأسطر
let pattern = /hello/gim;
let matches = text.match(pattern);
console.log(matches); // النتيجة: ["Hello", "HELLO", "hello"]
هنا جمعنا بين ثلاثة أعلام:
i: تجاهل حالة الأحرفg: البحث عن جميع التطابقاتm: البحث في جميع الأسطر
🎯 خلاصة الأعلام الرئيسية
| العلم | الوظيفة | مثال استخدام |
|---|---|---|
i |
تجاهل حالة الأحرف | /hello/i تطابق مع "Hello"، "HELLO"، "hello" |
g |
البحث عن جميع التطابقات | /cat/g يجد جميع كلمات "cat" في النص |
m |
البحث متعدد الأسطر | /^start/m يطابق "start" في بداية أي سطر |
❌ تجنب الأخطاء الشائعة
- ترتيب الأعلام غير مهم:
/gimنفس/migنفس/gmi - لا تكرر الأعلام:
/gg/أو/ii/خطأ - الأعلام تأتي بعد
/:/pattern/flagsوليس/flags/pattern
مثال صحيح:
// ✓ صحيح
let pattern1 = /test/gi;
let pattern2 = new RegExp('test', 'mi');
// ✗ خطأ
let pattern3 = /gitest/; // الأعلام ليست جزءاً من النمط
let pattern4 = /test/gg; // تكرار العلم ممنوع
🏆 تمارين تطبيقية
التمرين 1: ابحث عن جميع كلمات "javascript" في النص التالي بغض النظر عن حالة الأحرف:
let text = "I love JavaScript. javascript is amazing. JAVASCRIPT rules!";
// اكتب الحل هنا
التمرين 2: ابحث عن جميع الكلمات التي تبدأ بحرف "A" في بداية أي سطر:
let text = "Apple is fruit\nant is insect\nBanana is yellow";
// اكتب الحل هنا
🎓 اختبر نفسك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال