التعبيرات النمطية في C# مع أمثلة: من النظرية إلى التطبيق
\n\nالتعبيرات النمطية (regex) هي أداة قوية للبحث عن النص واستخراجه واستبداله وفقًا لنمط معين. في لغة C# (.NET)، يتم التعامل مع التعبيرات النمطية من خلال مساحة الأسماء System.Text.RegularExpressions والفئة Regex. في هذه المقالة، سنستعرض الإمكانيات الأساسية من خلال أمثلة واقعية: من البحث البسيط إلى التحقق من صحة البريد الإلكتروني ورقم الهاتف.
1. الأساسيات: فئة Regex وطرقها
\n\nالفئة الرئيسية للعمل هي Regex. توفر طرقًا ثابتة وطرقًا خاصة بالكائن. إليك أهمها:
- \n
IsMatch— تتحقق مما إذا كانت السلسلة تحتوي على تطابق مع النمط. \nMatch— تجد أول تطابق. \nMatches— تجد جميع التطابقات. \nReplace— تستبدل التطابقات بسلسلة محددة. \nSplit— تقسم السلسلة وفقًا للنمط. \n
مثال 1: فحص بسيط
\nusing System;\nusing System.Text.RegularExpressions;\n\nclass Program\n{\n static void Main()\n {\n string text = "مرحبًا، رقمي: 123-456-7890";\n string pattern = @"\\d{3}-\\d{3}-\\d{4}";\n\n if (Regex.IsMatch(text, pattern))\n {\n Console.WriteLine("تم العثور على الرقم!");\n }\n }\n}\n\n\nفي هذا المثال، \\d{3} تعني "ثلاثة أرقام بالضبط". يتم تخطي الشرطة المائلة العكسية باستخدام @ (سلسلة حرفية).
2. مجموعات الالتقاط واستخراج البيانات
\n\nتسمح مجموعات الالتقاط باستخراج أجزاء من التطابق. يتم تعريفها باستخدام الأقواس المستديرة (). تحصل كل مجموعة على رقم تسلسلي (بدءًا من 1).
مثال 2: استخراج اسم المستخدم والنطاق من البريد الإلكتروني
\nstring email = "user@example.com";\nstring pattern = @"^(\\w+)@(\\w+\\.\\w+)$";\n\nMatch match = Regex.Match(email, pattern);\n\nif (match.Success)\n{\n Console.WriteLine($"اسم المستخدم: {match.Groups[1].Value}"); // user\n Console.WriteLine($"النطاق: {match.Groups[2].Value}"); // example.com\n}\n\n\nهنا، (\\w+) يلتقط حرفًا أبجديًا رقميًا واحدًا أو أكثر. ^ و $ هما مرساة بداية ونهاية السلسلة.
مثال 3: تحليل URL
\nstring url = "https://pythonlib.ru/page?id=42";\nstring pattern = @"^(https?)://([^/]+)(/.*)?$";\n\nMatch m = Regex.Match(url, pattern);\nif (m.Success)\n{\n Console.WriteLine($"البروتوكول: {m.Groups[1].Value}"); // https\n Console.WriteLine($"النطاق: {m.Groups[2].Value}"); // pythonlib.ru\n Console.WriteLine($"المسار: {m.Groups[3].Value}"); // /page?id=42\n}\n\n\n3. استبدال النص وحذفه
\n\nتسمح طريقة Replace باستبدال الأجزاء التي تم العثور عليها. يمكن استخدام المراجع العكسية مثل $1، $2 لإدراج المجموعات.
مثال 4: تنسيق رقم الهاتف
\nstring raw = "89161234567";\nstring pattern = @"(\\d{1})(\\d{3})(\\d{3})(\\d{2})(\\d{2})";\nstring replacement = "+7 ($2) $3-$4-$5";\n\nstring formatted = Regex.Replace(raw, pattern, replacement);\nConsole.WriteLine(formatted); // +7 (916) 123-45-67\n\n\nمثال 5: إزالة المسافات الزائدة
\nstring text = "هذا نص به مسافات زائدة.";\nstring cleaned = Regex.Replace(text, @"\\s+", " ");\nConsole.WriteLine(cleaned); // "هذا نص به مسافات زائدة."\n\n\n\\s+ — حرف مسافة بيضاء واحد أو أكثر. نستبدلها بمسافة واحدة.
4. حالات واقعية: التحقق من البريد الإلكتروني ورقم الهاتف
\n\nعمليًا، تُستخدم التعبيرات النمطية غالبًا للتحقق من إدخال المستخدم. نقدم مثالين نموذجيين.
\n\nالتحقق من البريد الإلكتروني (مبسط)
\npublic static bool IsValidEmail(string email)\n{\n if (string.IsNullOrWhiteSpace(email))\n return false;\