التعبيرات النمطية في C# مع أمثلة: عملياً
التعبيرات النمطية (regex) هي أداة قوية للبحث والتحقق واستبدال النص وفقاً لنمط. في C# (.NET) يتم التعامل معها عبر الفئة System.Text.RegularExpressions.Regex. في هذه المقالة سنستعرض الإمكانيات الأساسية من خلال أمثلة واقعية: من التحقق البسيط من البريد الإلكتروني إلى استخراج البيانات من HTML. جميع الأمثلة جاهزة للنسخ والاستخدام في مشاريعك.
أساسيات العمل مع Regex في C#
توفر الفئة Regex ثلاث طرق رئيسية:
- IsMatch — تتحقق مما إذا كانت السلسلة تطابق النمط؛
- Match — تجد أول تطابق؛
- Matches — تجد جميع التطابقات.
مثال بسيط — التحقق مما إذا كانت السلسلة تحتوي على أرقام:
using System;using System.Text.RegularExpressions;
public class RegexExample{ public static void Main() { string text = "رقمي: 12345"; string pattern = @"\\d+"; // رقم واحد أو أكثر
bool hasDigits = Regex.IsMatch(text, pattern); Console.WriteLine(hasDigits); // True }}لاحظ استخدام @ قبل السلسلة — هذا هو verbatim string literal الذي يعطل هروب الشرطة المائلة العكسية. بدونه كان يجب كتابة "\\\\d+".
التحقق من البريد الإلكتروني ورقم الهاتف
التحقق من صحة البريد الإلكتروني
التحقق من البريد الإلكتروني هو مهمة كلاسيكية. نمط بسيط لكنه فعال:
public static bool IsValidEmail(string email){ string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"; return Regex.IsMatch(email, pattern);}
// الاستخدامConsole.WriteLine(IsValidEmail("user@example.com")); // TrueConsole.WriteLine(IsValidEmail("user@.com")); // Falseتحليل النمط:
^— بداية السلسلة؛[a-zA-Z0-9._%+-]+— الجزء المحلي (حروف، أرقام ورموز خاصة)؛@— رمز "أرنب"؛[a-zA-Z0-9.-]+— النطاق؛\\.— نقطة (مفلترة)؛[a-zA-Z]{2,}— منطقة النطاق (حرفان على الأقل)؛$— نهاية السلسلة.
التحقق من رقم الهاتف
مثال للتنسيق الروسي (+7 XXX XXX-XX-XX):
public static bool IsValidRussianPhone(string phone){ string pattern = @"^\\+7\\d{3}\\d{3}-\\d{2}-\\d{2}$"; // أو خيار أكثر مرونة: // @"^\\+7[\\s-]?\\d{3}[\\s-]?\\d{3}[\\s-]?\\d{2}[\\s-]?\\d{2}$" return Regex.IsMatch(phone, pattern);}استخراج البيانات من النص باستخدام مجموعات الالتقاط
مجموعات الالتقاط (الأقواس ()) تسمح باستخراج أجزاء من التطابق. على سبيل المثال، استخراج جميع عناوين البريد الإلكتروني من النص:
string text = "جهات الاتصال: support@site.com, admin@test.org, info@company.net";string pattern = @"([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+)\\.([a-zA-Z]{2,})";
MatchCollection matches = Regex.Matches(text, pattern);foreach (Match match in matches){ Console.WriteLine($"البريد الإلكتروني الكامل: {match.Value}"); Console.WriteLine($"الجزء المحلي: {match.Groups[1].Value}"); Console.WriteLine($"النطاق: {match.Groups[2].Value}"); Console.WriteLine($"المنطقة: {match.Groups[3].Value}"); Console.WriteLine("---");}النتيجة:
البريد الإلكتروني الكامل: support@site.comالجزء المحلي: supportالنطاق: siteالمنطقة: com---يتم ترقيم المجموعات بدءاً من 1 (المجموعة 0 هي التطابق الكامل). يمكن إعطاؤها أسماء:
string pattern = @"(?<user>[a-zA-Z0-9._%+-]+)@(?<domain>[a-zA-Z0-9.-]+)\\.(?<tld>[a-zA-Z]{2,})";// الوصول: match.Groups["user"].Valueاستخراج الروابط من HTML
string html = @"<a href='https://example.com'>Examp