كائن `RegExp`

تشرح هذه المقالة كائن RegExp۔

سنشرح كائن RegExp مع أمثلة عملية۔

YouTube Video

كائن RegExp

ما هو RegExp؟

RegExp (التعبير النمطي) هو كائن يُستخدم لتمثيل أنماط السلاسل النصية۔ على عكس المقارنات البسيطة للحروف، يمكنك تعريف 'سلاسل نصية تستوفي شروطًا معينة' بشكل مرن.۔

باستخدام كائن RegExp، يمكنك تنفيذ عمليات مثل البحث والتحقق والاستخراج والاستبدال للنصوص بشكل مختصر وواضح.۔ إنه فعال للغاية في المهام اليومية مثل التحقق من مدخلات النماذج، تحليل السجلات، وتنسيق النصوص.۔ فيما يلي بعض الأمثلة البسيطة للعبارات النمطية (التعابير النمطية).۔

1const pattern = /abc/;
  • يفحص هذا التعبير النمطي ما إذا كانت السلسلة 'abc' موجودة۔

كيفية إنشاء التعبيرات النمطية (طريقتان)

هناك نوعان من صياغة RegExp: الصياغة الحرفية و الصياغة بواسطة المُنشئ

1// Literal notation: pattern and flags are written together
2const literal         = /hello/;
3const literalWithFlag = /hello/i;
4const literalDigits   = /\d+/;
5
6// Constructor notation: pattern and flags are passed separately
7const constructor         = new RegExp("hello");
8const constructorWithFlag = new RegExp("hello", "i");
9const constructorDigits   = new RegExp("\\d+");
  • الترميز الحرفي موجز وقابل للقراءة، مما يجعله مناسباً للتعابير النمطية المستخدمة كثوابت.۔ من ناحية أخرى، يُستخدم الترميز بواسطة المُنشئ عندما ترغب في بناء النمط باستخدام متغيرات أو تحديد محتواه أثناء وقت التشغيل.۔
  • مع الترميز الحرفي، يمكنك وصف كل من التعبير النمطي والرايات بشكل بديهي معاً.۔ في المقابل، مع ترميز المُنشئ تحتاج إلى تحديد النمط والرايات بشكل منفصل.۔
  • بالإضافة إلى ذلك، مع ترميز المُنشئ، تقوم بتمرير التعبير النمطي كسلسلة نصية، لذلك يجب تهريب الخطوط المائلة العكسية مرتين.۔

test(): أبسط عملية تحقق

يوفر كائن RegExp طرقًا لتنفيذ التقييمات والعمليات باستخدام العبارات النمطية.۔ الدالة test() تعيد قيمة منطقية (boolean) تُبين ما إذا كان النمط يطابق أم لا۔

1const regex = /JavaScript/;
2
3console.log(regex.test("I love JavaScript")); // true
4console.log(regex.test("I love TypeScript")); // false
  • هي أول دالة يجب أن تتعلمها، وهي مثالية لتقسيم الحالات أو للتحقق من المدخلات۔

match(): الحصول على نتائج المطابقة

تعيد الدالة match() مصفوفة تحتوي على النص المطابق ومعلومات تفصيلية۔

1const text = "Version 1.2.3";
2const result = text.match(/\d+\.\d+\.\d+/);
3
4console.log(result[0]); // "1.2.3"
  • تُعتبر match() أكثر ملاءمة من test() لعمليات الاستخراج والتحليل۔

replace(): الاستبدال باستخدام التعبيرات النمطية

الدالة replace() تحول الجزء المطابق إلى سلسلة نصية أخرى۔

1const text = "Hello   World";
2const result = text.replace(/\s+/g, " ");
3
4console.log(result); // "Hello World"
  • يمكنك استخدامه لتنسيق السجلات أو إزالة الفراغات غير الضرورية وتنسيقها.۔

أساسيات العلامات (g، i، m)

يمكنك تحديد 'علامات' في العبارات النمطية.۔ العلامات هي خيارات تتحكم في كيفية معالجة العبارة النمطية للسلاسل النصية وفقًا لقواعد معينة.۔ حتى مع نفس النمط، يمكن أن تتغير النتائج حسب العلامات المستخدمة.۔

1const text = "apple Apple APPLE";
2const regex = /apple/gi;        // or new RegExp("apple", "gi");
3
4console.log(text.match(regex)); // ["apple", "Apple", "APPLE"]
  • علامة g (عمومية) تبحث في جميع أجزاء السلسلة النصية.۔
  • علامة i (تجاهل حالة الأحرف) تتجاهل الفرق بين الحروف الكبيرة والصغيرة أثناء المطابقة.۔
1const multilineText = `apple
2banana
3apple`;
4
5const regexM = /^apple/gm;
6
7console.log(multilineText.match(regexM)); // ["apple", "apple"]
  • تُستخدم علامة m (متعددة الأسطر) لمعالجة السلاسل النصية متعددة الأسطر سطرًا بسطر.۔ مع ذلك، يعمل كل من ^ و $ استنادًا إلى بداية أو نهاية كل سطر، وليس السلسلة النصية بأكملها.۔

فئات الأحرف: دمج العديد من الخيارات

باستخدام الأقواس المربعة [] يمكنك تحديد مجموعة من الأحرف المحتملة لموضع واحد۔

1const regex = /gr[ae]y/;
2
3console.log(regex.test("gray")); // true
4console.log(regex.test("grey")); // true
  • يكون هذا مفيدًا لاحتواء الاختلافات الإملائية والخيارات البسيطة۔

الأحرف الوصفية: اختصارات شائعة

الرموز الفوقية هي رموز تتيح لك كتابة الأنماط الشائعة الاستخدام بشكل أقصر.۔

1const regex = /\d{4}-\d{2}-\d{2}/;  // or new RegExp("\\d{4}-\\d{2}-\\d{2}");
2
3console.log(regex.test("2025-12-29")); // true
  • \d تعني رقمًا، و{n} تحدد عدد التكرارات۔

^ و $: التحقق من السلسلة بالكامل

^ و $ يمثلان بداية ونهاية السلسلة النصية۔

1const regex = /^\d+$/;
2
3console.log(regex.test("123"));   // true
4console.log(regex.test("123a"));  // false
  • يكونان مهمين في الحالات التي تتطلب مطابقة تامة، مثل إدخالات النماذج۔

التجميع والالتقاط

باستخدام الأقواس ()، يمكنك استخراج القيم الجزئية

1const text = "2025/12/29";
2const regex = /(\d{4})\/(\d{2})\/(\d{2})/;
3const [, year, month, day] = text.match(regex);
4
5console.log(year, month, day); // 2025 12 29
  • يُستخدم كثيرًا لتقسيم التواريخ والسلاسل النصية المنظمة۔

أخطاء شائعة ونقاط يجب ملاحظتها

التعبيرات النمطية قوية، لكنها تصبح صعبة القراءة في الغالب۔

1// Hard to read
2const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+$/;
  • إذا أصبحت العبارة النمطية معقدة جدًا، يمكنك التفكير في إضافة تعليقات، أو تقسيم العبارات، أو تعديل العملية نفسها.۔

الملخص

يُعد RegExp ميزة أساسية في جافاسكريبت لوصف معالجة النصوص بشكل مبسط ودقيق۔ لا تحتاج إلى تعلم تعبيرات نمطية معقدة منذ البداية؛ الأهم هو استخدام الطرق والصيغ الأساسية مثل test وmatch وreplace بما يتناسب مع احتياجاتك العملية۔ إذا استطعت أن تتعامل مع التعبيرات النمطية ليس كـ'معرفة خاصة' بل كـ'أدوات لتمثيل الأنماط بشكل منظم'، ستعزز جودة ووضوح التحقق من المدخلات ومعالجة النصوص بشكل كبير۔

يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔

YouTube Video