مقدمة في التعبيرات المنتظمة في Swift
\n\nالتعبيرات المنتظمة (regex) هي أداة قوية للبحث عن النص واستخراجه واستبداله وفقًا لنمط معين. في Swift، يتم تنفيذ العمل مع التعبيرات المنتظمة من خلال الفئة NSRegularExpression من إطار عمل Foundation، بالإضافة إلى الطرق المضمنة في السلاسل النصية. إنها أداة لا غنى عنها عند تطوير تطبيقات iOS وmacOS للتحقق من صحة النماذج، وتحليل البيانات، وتصفية النص، والعديد من المهام الأخرى.
في هذه المقالة، سنستعرض الإمكانيات الأساسية للعمل مع التعبيرات المنتظمة في Swift من خلال أمثلة عملية. ستتعلم كيفية إنشاء الأنماط، وإجراء البحث، والاستبدال، واستخراج البيانات.
\n\nأساسيات العمل مع NSRegularExpression
\n\nالفئة NSRegularExpression هي الطريقة الأساسية للعمل مع التعبيرات المنتظمة في Swift. دعنا نستعرض العمليات الأساسية.
إنشاء تعبير منتظم
\n\nimport Foundation\n\nlet pattern = "[A-Za-z]+@[A-Za-z]+\\\\.[A-Za-z]+"\nguard let regex = try? NSRegularExpression(pattern: pattern) else {\n fatalError("نمط غير صحيح")\n}\n\nلاحظ الشرطة المائلة المزدوجة \\\\ - في Swift، تتطلب السلاسل النصية هروب الشرطة المائلة العكسية.
البحث عن أول تطابق
\n\nlet text = "اتصل بنا عبر البريد الإلكتروني: support@example.com"\nlet nsString = text as NSString\nlet range = NSRange(location: 0, length: nsString.length)\n\nif let match = regex.firstMatch(in: text, range: range) {\n let email = nsString.substring(with: match.range)\n print("تم العثور على بريد إلكتروني: \\(email)") // support@example.com\n}\n\nالبحث عن جميع التطابقات
\n\nlet text = "جهات الاتصال: info@site.com, admin@site.com, support@site.com"\nlet matches = regex.matches(in: text, range: NSRange(location: 0, length: text.count))\n\nfor match in matches {\n let range = match.range\n let email = (text as NSString).substring(with: range)\n print(email)\n}\n// الإخراج:\n// info@site.com\n// admin@site.com\n// support@site.com\n\nاستخدام مجموعات الالتقاط
\n\nتسمح مجموعات الالتقاط باستخراج أجزاء من التطابق. في Swift، يتم تمييز المجموعات بأقواس دائرية ().
استخراج البيانات باستخدام المجموعات
\n\nlet pattern = "(\\\\d{4})-(\\\\d{2})-(\\\\d{2})"\nlet dateString = "اليوم: 2024-03-15"\n\nguard let regex = try? NSRegularExpression(pattern: pattern) else { return }\nlet nsString = dateString as NSString\n\nif let match = regex.firstMatch(in: dateString, range: NSRange(location: 0, length: nsString.length)) {\n let fullDate = nsString.substring(with: match.range) // 2024-03-15\n let year = nsString.substring(with: match.range(at: 1)) // 2024\n let month = nsString.substring(with: match.range(at: 2)) // 03\n let day = nsString.substring(with: match.range(at: 3)) // 15\n \n print("السنة: \\(year)، الشهر: \\(month)، اليوم: \\(day)")\n}\n\nالمجموعات المسماة (العمل مع Range)
\n\nبدءًا من Swift 5.7، يمكن استخدام بناء جملة أكثر ملاءمة مع Range:
let text = "السعر: 1500 روبل"\nlet pattern = #"(\\d+)\\sروبل"#\n\nif let range = text.range(of: pattern, options: .regularExpression) {\n let match = text[range]\n print("تم العثور على: \\(match)") // 1500 روبل\n}\n\nاستبدال النص باستخدام التعبيرات المنتظمة
\n\nإحدى أكثر الإمكانيات فائدة هي استبدال أجزاء من النص وفقًا لنمط معين.
\n\nاستبدال بسيط
\n\nlet text = "اتصل على الرقم +7 (123) 456-78-90"\nlet pattern = "\\\\+7\\\\s\\\\(\\\\d{3}\\\\)\\\\s\\\\d{3}-\\\\d{2}-\\\\d{2}"\nlet replacement = "[رقم مخفي]"\n\nguard let regex = try? NSRegularExpression(pattern: pattern) else { return }\nlet modifiedText = regex.stringByReplacingMatches(\n in: text,\n range: NSRange(location: 0, length: text.count),\n withTemplate: replacement\n)\n\nprint(modifiedText) // اتصل على الرقم [رقم مخفي]\n\n