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 eksik
2val 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)
6
7// DOĞRU: ham string kullan
8val 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()
3
4// YANLIŞ: find() ile kontrol etmek
5if (emailPattern.find(email)!= null) {
6println("Geçerli email")
7}
8
9// DOĞRU: matches() kullan
10if (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:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1val pattern1 = Regex("""\w+""")
2val pattern2 = """\w+""".toRegex()
3
4// İkisi de aynı şekilde çalışır
5val word = "Merhaba"
6println(pattern1.containsMatchIn(word)) // true
7println(pattern2.containsMatchIn(word)) // true

Dö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"
3
4// Sadece var mı yok mu kontrol
5if (pattern.containsMatchIn(phone)) {
6println("Telefon numarası bulundu")
7}
8
9// Eşleşmeyi kullanmak gerekiyorsa
10val 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ştirir
2val wrong = "1.2.3".toRegex()
3println(wrong.matches("1a2b3")) // true (istenmeyen)
4
5// DOĞRU: nokta kaçış karakteri ile
6val correct = """1\.2\.3""".toRegex()
7println(correct.matches("1.2.3")) // true
8println(correct.matches("1a2b3")) // false

Pratik 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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz