التعبيرات المنتظمة في Kotlin مع أمثلة: عمليًا
التعبيرات المنتظمة (regex) هي أداة قوية للعمل مع النصوص، تتيح إجراء البحث والاستبدال والتحقق من صحة السلاسل وفقًا لنمط معين. في Kotlin، يتم تنفيذ العمل مع التعبيرات المنتظمة من خلال فئة Regex ومجموعة من دوال الامتداد الملائمة. في هذه المقالة، سنشرح بناء الجملة والطرق الأساسية ونستعرض أمثلة عملية ستساعدك على إتقان regex في Kotlin بسرعة.
1. أساسيات العمل مع فئة Regex
في Kotlin، يتم إنشاء التعبير المنتظم باستخدام فئة Regex. يمكن تحديد النمط كسلسلة نصية عادية أو باستخدام السلسلة النصية الخام (الاقتباسات الثلاثية """)، وهو أمر مناسب بشكل خاص لتجنب استخدام أحرف الهروب للخطوط المائلة العكسية.
// سلسلة نصية عاديةval pattern1 = Regex("\\\\d+") // رقم واحد أو أكثر
// سلسلة نصية خام (موصى بها)val pattern2 = Regex("""\\d+""") // نفس الشيء، ولكن بدون هروبتقبل فئة Regex أيضًا علامات اختيارية، مثل RegexOption.IGNORE_CASE للبحث غير الحساس لحالة الأحرف.
val caseInsensitive = Regex("""hello""", RegexOption.IGNORE_CASE)2. الطرق الأساسية: match، find، replace
توفر Kotlin عدة طرق رئيسية للعمل مع التعبيرات المنتظمة. دعنا نستعرض الأكثر شيوعًا.
2.1. طريقة matchEntire (المطابقة الكاملة)
تتحقق مما إذا كانت السلسلة بأكملها تطابق النمط. تُرجع MatchResult? أو null.
val regex = Regex("""\\d{3}-\\d{2}-\\d{4}""")val text = "123-45-6789"val matchResult = regex.matchEntire(text)println(matchResult?.value) // الإخراج: 123-45-6789
// إذا كانت السلسلة لا تطابق النمطval badText = "123-45-678"println(regex.matchEntire(badText)) // الإخراج: null2.2. طريقة find (أول تطابق)
تبحث عن أول ظهور للنمط في السلسلة. تُرجع MatchResult?.
val regex = Regex("""\\d+""")val text = "السعر: 150 روبل، الخصم: 30%"val firstMatch = regex.find(text)println(firstMatch?.value) // الإخراج: 1502.3. طريقة findAll (جميع التطابقات)
تجد جميع التطابقات غير المتداخلة للنمط. تُرجع تسلسلًا من MatchResult.
val regex = Regex("""\\d+""")val text = "السعر: 150 روبل، الخصم: 30%"val allMatches = regex.findAll(text)allMatches.forEach { println(it.value) }// الإخراج:// 150// 302.4. طريقة replace (الاستبدال)
تستبدل جميع تطابقات النمط بسلسلة نصية محددة أو نتيجة دالة لامدا.
val regex = Regex("""\\d+""")val text = "المعرف: 12345، الرمز: 67890"val result = regex.replace(text, "***")println(result) // الإخراج: المعرف: ***، الرمز: ***
// الاستبدال باستخدام لامدا (استبدال ديناميكي)val dynamicResult = regex.replace(text) { matchResult -> "[" + matchResult.value.toInt().toString() + "]"}println(dynamicResult) // الإخراج: المعرف: [12345]، الرمز: [67890]3. مجموعات الالتقاط (capturing groups)
تسمح مجموعات الالتقاط باستخراج أجزاء من التطابق. في Kotlin، يمكن الوصول إلى المجموعات بواسطة الفهرس أو الاسم (إذا تم تحديده).
3.1. الوصول بواسطة الفهرس
val regex = Regex("""(\\d{2})\\.(\\d{2})\\.(\\d{4})""") // التاريخ بتنسيق يوم.شهر.سنةval text = "اليوم: 15.03.2024"val match = regex.find(text)if (match != null) { val (day, month, year) = match.destructured println("اليوم: $day، الشهر: $month، السنة: $year") // الإخراج: اليوم: 15، الشهر: 03، السنة: 2024}3.2. المجموعات المسماة
في Kotlin، يمكن استخدام المجموعات المسماة (بناء الجملة (?<name>...)).
val regex = Regex("""(?<username>\\w+)@(?<domain>\\w+\\.\\w+)""")val text = "البريد الإلكتروني: user@example.com"val match = regex.find(text)if (match != null) { val username = match.groups["u