التعبيرات المنتظمة في TypeScript مع أمثلة: عمليًا

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التعبيرات المنتظمة في TypeScript: من النظرية إلى التطبيق العملي

التعبيرات المنتظمة (regex) هي أداة قوية للعمل مع السلاسل النصية. في TypeScript، لا تسمح فقط بالبحث والاستبدال والتحقق من الصحة، بل توفر أيضًا كتابة أنواع صارمة، مما يقلل من عدد الأخطاء في مرحلة الترجمة. في هذه المقالة، سنشرح كيفية استخدام التعبيرات المنتظمة في TypeScript من خلال أمثلة واقعية: من التحقق من صحة البريد الإلكتروني إلى استخراج البيانات بشكل آمن.



1. إنشاء وكتابة أنواع التعبيرات المنتظمة

في TypeScript، يمكن إنشاء تعبير منتظم بطريقتين: باستخدام حرفية أو المُنشئ RegExp. الطريقة الأولى هي المفضلة لأنها أقصر ولا تتطلب هروب الخطوط المائلة العكسية.



// الحرفية (الطريقة الموصى بها)const emailRegex: RegExp = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;

// المُنشئ (مفيد للأنماط الديناميكية)const pattern: string = 'hello';const dynamicRegex: RegExp = new RegExp(pattern, 'gi');

console.log(emailRegex.test('user@example.com')); // trueconsole.log(dynamicRegex.test('Hello, world!')); // true (العلامة i تتجاهل حالة الأحرف)


لاحظ تعليق النوع : RegExp. يقوم TypeScript تلقائيًا باستنتاج النوع للحرفيات، لكن التحديد الصريح يساعد في توثيق الكود.



2. العلامات وكتابة أنواعها

تغير العلامات سلوك التعبير المنتظم. في TypeScript، يمكن تحديد نوع العلامات من خلال حرفية سلسلة نصية أو تعداد. دعنا نستعرض العلامات الرئيسية:



  • g — بحث عام (لا يتوقف بعد أول تطابق)؛
  • i — وضع غير حساس لحالة الأحرف؛
  • m — وضع متعدد الأسطر (^ و $ يعملان لكل سطر)؛
  • s — النقطة تطابق حرف السطر الجديد؛
  • u — دعم Unicode؛
  • y — بحث من آخر موضع تم العثور عليه (sticky).


// كتابة أنواع العلامات عبر سلسلة نصيةconst regexWithFlags: RegExp = /test/gim;

// التحقق من العلاماتconsole.log(regexWithFlags.flags); // "gim"console.log(regexWithFlags.global); // trueconsole.log(regexWithFlags.ignoreCase); // trueconsole.log(regexWithFlags.multiline); // true


بالنسبة للعلامات الديناميكية، استخدم النوع string، لكن من الأفضل تقييده بالقيم المسموح بها باستخدام اتحاد حرفي:



type RegexFlags = 'g' | 'i' | 'm' | 's' | 'u' | 'y';const flags: RegexFlags = 'gi'; // خطأ: 'gi' ليس علامة منفردة// الصحيح: تمرير سلسلة نصيةconst dynamicFlags: string = 'gi';const regex: RegExp = new RegExp('pattern', dynamicFlags);


3. طرق RegExp وكتابة أنواع النتائج

الطرق الرئيسية للعمل مع التعبيرات المنتظمة في TypeScript:



  • test() — تُرجع boolean؛
  • exec() — تُرجع RegExpExecArray | null؛
  • match() — طريقة السلسلة النصية، تُرجع RegExpMatchArray | null؛
  • replace() — تستبدل التطابقات وتُرجع سلسلة نصية؛
  • search() — تُرجع فهرس أول تطابق أو -1.


لنلقِ نظرة على مثال مع exec()، الذي يتيح الوصول إلى مجموعات الالتقاط:



const dateRegex: RegExp = /(\\d{4})-(\\d{2})-(\\d{2})/;const dateStr: string = 'اليوم 2025-03-15';

const match: RegExpExecArray | null = dateRegex.exec(dateStr);

if (match) { const [fullMatch, year, month, day] = match; console.log(`السنة: ${year}, الشهر: ${month}, اليوم: ${day}`); // الإخراج: السنة: 2025, الشهر: 03, اليوم: 15} else { console.log('لم يتم العثور على تاريخ');}


لاحظ: match[0] هو التطابق الكامل، والمؤشرات 1، 2، 3 هي مجموعات الالتقاط. يقوم TypeScript باستنتاج الأنواع بشكل صحيح إذا تم استخدام التفكيك

المدونات

توصيات الكتب