Kotlin Regex Hatası: String Pattern Eşleştirmede Yaygın Yanılgılar
Kotlin'de düzenli ifade (regex) çalıştırırken en sık yapılan hata, kaçış karakterlerini yanlış kullanmaktır. Özellikle backslash (\) karakterleri, ham string (raw string) ile yazılmazsa sorun çıkartır.
İlk yaygın yanılgı, kaçış karakterlerini normal string içinde yazmak. Mesela bir sayı dizisini bulacak regex yazarken:
1// YANLIŞ: kaçış karakteri eksik2val pattern1 = "\\d+".toRegex()3val text = "Sayı: 123 ve 456"4println(pattern1.findAll(text).map { it.value })5// Çıktı: [123, 456] (tesadüfen çalışır ama güvenilir değil)67// DOĞRU: ham string kullan8val pattern2 = """\d+""".toRegex()9println(pattern2.findAll(text).map { it.value })10// Çıktı: [123, 456]İkinci hata, matches() ve find() arasındaki farkı bilmemek. matches() tüm stringi kontrol eder, find() ise parça bulur:
1val email = "test@example.com"2val emailPattern = """^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$""".toRegex()34// YANLIŞ: find() ile kontrol etmek5if (emailPattern.find(email)!= null) {6println("Geçerli email")7}89// DOĞRU: matches() kullan10if (emailPattern.matches(email)) {11println("Geçerli email")12}Üçüncü sorun, Regex() constructor'ı ile toRegex() extension function'ını karıştırmak. İkisi de çalışır ama toRegex() daha Kotlin'ik:
1val pattern1 = Regex("""\w+""")2val pattern2 = """\w+""".toRegex()34// İkisi de aynı şekilde çalışır5val word = "Merhaba"6println(pattern1.containsMatchIn(word)) // true7println(pattern2.containsMatchIn(word)) // trueDördüncü yanılgı, containsMatchIn() ile find() arasında seçim yapmak. Sadece varlığı kontrol etmek için containsMatchIn() daha hızlıdır:
1val pattern = """\d{3}-\d{4}""".toRegex()2val phone = "Telefon: 555-1234"34// Sadece var mı yok mu kontrol5if (pattern.containsMatchIn(phone)) {6println("Telefon numarası bulundu")7}89// Eşleşmeyi kullanmak gerekiyorsa10val match = pattern.find(phone)11if (match!= null) {12println("Bulundu: ${match.value}")13}Beşinci hata, özel karakterleri kaçıştırmamak. Nokta (.) gibi karakterlerin regex'te özel anlamı vardır:
1// YANLIŞ: "." her karakteri eşleştirir2val wrong = "1.2.3".toRegex()3println(wrong.matches("1a2b3")) // true (istenmeyen)45// DOĞRU: nokta kaçış karakteri ile6val correct = """1\.2\.3""".toRegex()7println(correct.matches("1.2.3")) // true8println(correct.matches("1a2b3")) // falsePratik bir ipucu: Ham string (triple quote) kullanırken kaçış karakteri sayısı azalır, kod daha okunaklı olur. Karmaşık regex'ler için Regex() constructor'ında RegexOption.COMMENTS seçeneği ile satır içi açıklama ekleyebilirsin. Regex testi için online araçlar (regex101.com) kullan; Kotlin'de yazı yanlış çıkmazsa regex'in kendisi yanlış demektir.
0 yorum