التعبيرات المنتظمة في Swift: أداة قوية للعمل مع النصوص
التعبيرات المنتظمة (regex) هي أداة لا غنى عنها لمطوري iOS و macOS. فهي تسمح بإجراء بحث معقد واستبدال والتحقق من صحة البيانات النصية باستخدام أنماط مضغوطة. في Swift، يتم تنفيذ العمل مع التعبيرات المنتظمة من خلال الفئة NSRegularExpression من إطار العمل Foundation. في هذه المقالة، سنقوم بتحليل جميع جوانب استخدام regex في Swift: من البنية الأساسية إلى التقنيات المتقدمة، مع أمثلة عملية لتطبيقات iOS و macOS.
أساسيات NSRegularExpression في Swift
للعمل مع التعبيرات المنتظمة في Swift، يتم استخدام الفئة NSRegularExpression. وهي توفر طرقًا قوية للبحث والاستبدال واستخراج البيانات من السلاسل النصية. دعنا نلقي نظرة على البنية الأساسية للتهيئة:
import Foundation
let pattern = "\\\\d{3}-\\\\d{2}-\\\\d{4}" // نمط لـ SSNlet text = "رقم SSN الخاص بي: 123-45-6789"
do { let regex = try NSRegularExpression(pattern: pattern) let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text)) for match in results { let range = Range(match.range, in: text)! print("تم العثور على: \\(text[range])") }} catch { print("خطأ في التعبير المنتظم: \\(error.localizedDescription)")}لاحظ هروب الشرطة المائلة العكسية في سلاسل Swift. لكل شرطة مائلة عكسية في النمط، يجب وضع اثنتين (\\\\d بدلاً من \\d).
إنشاء وتكوين التعبير المنتظم
يأخذ المُنشئ NSRegularExpression معاملًا اختياريًا options يسمح بتكوين سلوك regex:
.caseInsensitive— تجاهل حالة الأحرف.dotMatchesLineSeparators— النقطة تطابق أحرف السطر الجديد.anchorsMatchLines— المراسي ^ و $ تعمل لكل سطر.useUnixLineSeparators— استخدام فقط كفاصل للأسطر
let regex = try NSRegularExpression( pattern: "swift", options: [.caseInsensitive])// الآن سيجد النمط "Swift", "SWIFT", "swift" إلخ.البحث واستخراج البيانات باستخدام regex
إحدى المهام الرئيسية للتعبيرات المنتظمة هي البحث عن السلاسل الفرعية المطابقة للنمط. في Swift، يتم ذلك من خلال الطريقة matches(in:options:range:).
البحث عن جميع التطابقات
let text = "جهات الاتصال: email@example.com, support@test.org, admin@site.com"let emailPattern = "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}"
let regex = try NSRegularExpression(pattern: emailPattern)let matches = regex.matches(in: text, range: NSRange(text.startIndex..., in: text))
print("تم العثور على إيميلات: \\(matches.count)")for match in matches { if let range = Range(match.range, in: text) { print(String(text[range])) }}// الإخراج:// تم العثور على إيميلات: 3// email@example.com// support@test.org// admin@site.comالبحث مع التقاط المجموعات
المجموعات بين الأقواس تسمح باستخراج أجزاء من التطابق. هذا مفيد بشكل خاص لتحليل البيانات المنظمة:
let logLine = "2024-01-15 14:30:22 [ERROR] فشل الاتصال بالخادم"let logPattern = "(\\\\d{4}-\\\\d{2}-\\\\d{2}) (\\\\d{2}:\\\\d{2}:\\\\d{2}) \\\\[(\\\\w+)\\\\] (.+)"
let regex = try NSRegularExpression(pattern: logPattern)if let match = regex.firstMatch(in: logLine, range: NSRange(logLine.startIndex..., in: logLine)) { let dateRange = Range(match.range(at: 1), in: logLine)! let timeRange = Range(match.range(at: 2), in: logLine)! let levelRange = Range(match.range(at: 3), in: logLine)! let messageRange = Range(match.range(at: 4), in: logLine)! print("التاريخ: \\(logLine[dateRange])") print("الوقت: \\(logL