التعبيرات المنتظمة في Swift مع أمثلة: عملياً
التعبيرات المنتظمة (regex) هي أداة قوية للعمل مع البيانات النصية. في Swift، يتم استخدام الفئة NSRegularExpression من إطار العمل Foundation للعمل مع التعبيرات المنتظمة. في هذه المقالة، سنستعرض أمثلة عملية لاستخدام التعبيرات المنتظمة في Swift لتطبيقات iOS و macOS: من البحث البسيط إلى التحقق المعقد واستبدال النص.
أساسيات العمل مع NSRegularExpression في Swift
توفر الفئة NSRegularExpression جميع الطرق اللازمة للعمل مع التعبيرات المنتظمة. تتضمن الخوارزمية الأساسية ثلاث خطوات:
- إنشاء كائن نمط التعبير المنتظم
- تطبيق النمط على السلسلة النصية
- معالجة النتائج (التطابقات، الاستبدالات)
إنشاء تعبير منتظم
إليك كيفية إنشاء وتطبيق أبسط تعبير منتظم للبحث عن كلمة "Swift":
import Foundation
let text = "نتعلم Swift وتطوير iOS"let pattern = "Swift"
do { let regex = try NSRegularExpression(pattern: pattern) let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text)) for match in results { if let range = Range(match.range, in: text) { print("تم العثور على: \\(text[range])") } }} catch { print("خطأ في التعبير المنتظم: \\(error.localizedDescription)")}لاحظ تحويل Range - هذه هي الطريقة القياسية للعمل مع المواضع في سلاسل Swift. نتيجة التنفيذ: "تم العثور على: Swift".
مثال عملي 1: البحث عن عناوين البريد الإلكتروني
إحدى المهام الأكثر شيوعاً هي استخراج عناوين البريد الإلكتروني من النص. لنلقِ نظرة على مثال يجد جميع عناوين البريد الإلكتروني في سلسلة نصية:
import Foundation
func findEmails(in text: String) -> [String] { let pattern = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}" var emails: [String] = [] do { let regex = try NSRegularExpression(pattern: pattern) let results = regex.matches(in: text, range: NSRange(text.startIndex..., in: text)) for match in results { if let range = Range(match.range, in: text) { emails.append(String(text[range])) } } } catch { print("خطأ: \\(error)") } return emails}
// مثال على الاستخدامlet sampleText = "جهات الاتصال: support@example.com و admin@site.org"let foundEmails = findEmails(in: sampleText)print(foundEmails) // ["support@example.com", "admin@site.org"]يراعي هذا النمط الأحرف القياسية المسموح بها في البريد الإلكتروني ويتحقق من وجود نقطة في جزء النطاق. للإنتاج، يمكن إضافة دعم للنطاقات السيريلية.
مثال عملي 2: التحقق من رقم الهاتف
التحقق من صحة البيانات المدخلة هو جزء مهم من أي تطبيق. إليك كيفية التحقق من رقم الهاتف الروسي بتنسيق +7 (XXX) XXX-XX-XX:
import Foundation
func isValidPhoneNumber(_ phone: String) -> Bool { // نمط للرقم الروسي: +7 (XXX) XXX-XX-XX let pattern = "^\\\\+7\\\\s?\\\\(?[0-9]{3}\\\\)?\\\\s?[0-9]{3}-?[0-9]{2}-?[0-9]{2}$" do { let regex = try NSRegularExpression(pattern: pattern) let range = NSRange(location: 0, length: phone.utf16.count) return regex.firstMatch(in: phone, range: range) != nil } catch { return false }}
// اختبارlet validNumbers = ["+7 (495) 123-45-67", "+74951234567", "+7 495 1234567"]let invalidNumbers = ["8 (495) 123-45-67", "+7 (495) 123-45-678", "abc"]
for number in validNumbers { print("\\(number): \\(isValidPhoneNumber(number))") // true}
for number in invalidNumbers { print("\\(number): \\(isValidPhoneNumber(number))") // false}يستخدم النمط مرساة