التعبيرات المنتظمة في Swift: دليل شامل للمبتدئين
\nالتعبيرات المنتظمة (regex) هي أداة قوية للبحث عن البيانات النصية واستبدالها والتحقق من صحتها. في Swift، يتم العمل مع التعبيرات المنتظمة من خلال الفئة NSRegularExpression من إطار العمل Foundation. في هذه المقالة، ستتعلم كيفية إنشاء وتطبيق التعبيرات المنتظمة في تطبيقات iOS و macOS، وستحلل أمثلة حقيقية وتتقن أساسيات بناء الجملة.
1. أساسيات بناء جملة التعبيرات المنتظمة
\nقبل كتابة كود Swift، من المهم فهم الرموز والتراكيب الأساسية للتعبيرات المنتظمة. إليك العناصر الأساسية:
\n- \n
.— أي حرف (باستثناء سطر جديد) \n *— 0 أو أكثر من التكرارات للحرف السابق \n +— 1 أو أكثر من التكرارات \n ?— 0 أو 1 تكرار (يجعل الحرف السابق اختيارياً) \n \\d— أي رقم (0-9) \n \\w— أي حرف أو رقم أو شرطة سفلية \n [abc]— أحد الأحرف a أو b أو c \n [^abc]— أي حرف باستثناء a أو b أو c \n ^— بداية السلسلة \n $— نهاية السلسلة \n
يتم دمج هذه الرموز لإنشاء أنماط. على سبيل المثال، النمط ^[A-Za-z]+$ يعني: السلسلة تتكون فقط من أحرف الأبجدية اللاتينية من البداية إلى النهاية.
2. إنشاء واستخدام NSRegularExpression في Swift
\nفي Swift، يبدأ العمل مع التعبيرات المنتظمة باستيراد Foundation وإنشاء مثيل من NSRegularExpression. لننظر إلى مثال بسيط: البحث عن جميع الأرقام في سلسلة.
import Foundation\n\nlet text = "رقمي: 123-456-7890"\nlet pattern = "\\\\d+" // النمط: رقم واحد أو أكثر\n\ndo {\n let regex = try NSRegularExpression(pattern: pattern)\n let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text))\n \n for match in results {\n if let range = Range(match.range, in: text) {\n print("تم العثور على: \\(text[range])")\n }\n }\n} catch {\n print("خطأ في التعبير المنتظم: \\(error.localizedDescription)")\n}\n// الإخراج:\n// تم العثور على: 123\n// تم العثور على: 456\n// تم العثور على: 7890\nلاحظ الهروب من الشرطة المائلة العكسية: في سلسلة Swift "\\\\d" تقابل التعبير المنتظم \\d. الفئة NSRegularExpression تطرح استثناءً عند وجود نمط غير صحيح، لذلك نستخدم try-catch.
2.1. العمل مع NSRange
\nالطريقة matches(in:range:) تُرجع مصفوفة من كائنات NSTextCheckingResult. كل نتيجة تحتوي على نطاق (NSRange) للتطابق الذي تم العثور عليه. للتحويل إلى Swift Range، استخدم المُهيئ Range(match.range, in: text).
3. أمثلة عملية للتعبيرات المنتظمة
\nلننظر إلى ثلاث مهام نموذجية: التحقق من البريد الإلكتروني، استخراج عناوين URL، واستبدال النص.
\n\n3.1. التحقق من صحة عنوان البريد الإلكتروني
\nلنتحقق مما إذا كانت السلسلة تطابق نمط بريد إلكتروني بسيط (نسخة مبسطة):
\nfunc isValidEmail(_ email: String) -> Bool {\n let pattern = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}$"\n let regex = try? NSRegularExpression(pattern: pattern)\n let range = NSRange(location: 0, length: email.utf16.count)\n return regex?.firstMatch(in: email, range: range) != nil\n}\n\nprint(isValidEmail("test@example.com")) // true\nprint(isValidEmail("invalid-email")) // false\nهنا نستخدم firstMatch الذي يُرجع أول تطابق. إذا لم يكن هناك تطابقات، يُرجع nil.
3.2. استخراج عناوين URL من النص
\nلنفترض أن لدينا سلسلة تحتوي على عدة روابط. لنستخرج جميع عناوين URL:
\nlet text = "قم بزيارة الموقع https://pythonlib.ru أو اكتب إلى support@pythonlib.ru"\nlet pattern = "https?://[\\\\w./%-]+"\n\ndo