التعبيرات النمطية في TypeScript: من النظرية إلى التطبيق
\nالتعبيرات النمطية (RegExp) هي أداة قوية للبحث والاستبدال والتحقق من صحة السلاسل النصية. في TypeScript، تعمل تمامًا كما في JavaScript، ولكنها تضيف كتابة صارمة، مما يبسط التصحيح ويزيد من موثوقية الكود. في هذه المقالة، سنشرح الصياغة والطرق والأمثلة الواقعية لاستخدام التعبيرات النمطية في TypeScript.
\n\nإنشاء التعبيرات النمطية في TypeScript
\nفي TypeScript، توجد طريقتان لإنشاء RegExp: الطريقة الحرفية وعبر المُنشئ. كلا الخيارين مكتوبان ويعيدان كائنًا من النوع RegExp.
الصياغة الحرفية
\nأبسط طريقة وأكثرها استخدامًا هي وضع النمط بين شرطتين مائلتين. تُحدد العلامات بعد الشرطة المائلة الثانية.
\n// البحث عن كلمة "hello" بدون مراعاة حالة الأحرف\nconst pattern: RegExp = /hello/i;\nconsole.log(pattern.test('Hello World')); // true\n\nمُنشئ RegExp
\nالمُنشئ مفيد عندما يتم تكوين النمط ديناميكيًا. الوسيطة الأولى هي سلسلة النمط، والثانية هي العلامات.
\nconst searchTerm: string = 'TypeScript';\nconst dynamicPattern: RegExp = new RegExp(searchTerm, 'gi');\nconsole.log('I love TypeScript and TypeScript is great'.match(dynamicPattern));\n// ['TypeScript', 'TypeScript']\n\nالطرق الأساسية لـ RegExp في TypeScript
\nترث TypeScript جميع طرق JavaScript للعمل مع التعبيرات النمطية. دعنا نلقي نظرة على الأكثر شيوعًا.
\n\ntest() — التحقق من الوجود
\nالطريقة test() تُرجع true أو false. مفيدة للتحقق من صحة النماذج.
const emailRegex: RegExp = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/;\nconst email: string = 'user@example.com';\nconsole.log(emailRegex.test(email)); // true\n\nexec() — بحث تفصيلي
\nexec() تُرجع مصفوفة تحتوي على التطابق والفهرس والمجموعات. إذا لم يكن هناك تطابق، تُرجع null.
const datePattern: RegExp = /(\\d{2})\\.(\\d{2})\\.(\\d{4})/;\nconst result: RegExpExecArray | null = datePattern.exec('اليوم 15.03.2025');\nif (result) {\n console.log(`اليوم: ${result[1]}, الشهر: ${result[2]}, السنة: ${result[3]}`);\n // اليوم: 15, الشهر: 03, السنة: 2025\n}\n\nmatch() و matchAll() للسلاسل النصية
\nالطريقة match() تُستدعى على السلسلة النصية وتستقبل RegExp. للبحث الشامل عن جميع التطابقات، استخدم matchAll().
const text: string = 'الرمز 123, الرمز 456, الرمز 789';\nconst numbers: RegExpMatchArray | null = text.match(/\\d+/g);\nconsole.log(numbers); // ['123', '456', '789']\n\n// matchAll() تُرجع مكررًا\nconst matches: IterableIterator<RegExpMatchArray> = text.matchAll(/(\\d+)/g);\nfor (const match of matches) {\n console.log(`تم العثور على رقم: ${match[1]}`);\n}\n\nأمثلة عملية للتعبيرات النمطية في TypeScript
\nالآن سنطبق النظرية على مهام حقيقية. جميع الأمثلة مكتوبة مع مراعاة الكتابة الصارمة في TypeScript.
\n\nمثال 1: التحقق من صحة عنوان البريد الإلكتروني
\nلننشئ دالة تتحقق من صحة البريد الإلكتروني. سنستخدم تعبيرًا نمطيًا مكتوبًا.
\nfunction isValidEmail(email: string): boolean {\n const emailRegex: RegExp = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\nconsole.log(isValidEmail('test@mail.ru')); // true\nconsole.log(isValidEmail('invalid-email')); // false\n\nمثال 2: استخراج الأرقام من سلسلة نصية
\nغالبًا ما نحتاج إلى الحصول على جميع الأرقام من النص. نستخدم البحث الشامل مع العلامة g.
function extractNumbers(text: string): number[] {\n const numberPattern: RegExp = /\\d+/g;\n const matches: RegExpMatchArray | null = text.match(numberPattern);\n return matches ? matches.map(Number) : [];\n}\n\nconst result: number[] = extractNumbers('السعر: 2500 ريال, الخصم 300 ريال');\nconsole.log(result); // [2500, 300]\n\