
Önceki Bölüm
Soru işaretine benzer iki yeni karakterimiz var. Artı + ve yıldız * işareti.
Öncelikle soru işaretinin ne işe yaradığını hatırlayalım.
Yıldız * işaretinin işlevi ise şu şekilde:
Yıldız işaretinin işlevini şu şekilde aklınızda tutabilirsiniz. "İlgili karakterden herhangi bir sayı kadar, sıfır da dâhil, eşleşebildiğin kadar eşleşmeye çalış." Ya da başka şekilde ifade etmek gerekirse, "Solundaki karakterden ya da alt ifadeden mümkün olduğu kadar eşleşmeye çalış ama hiç bulamasan da sorun değil."
Yani yıldız ve soru işaretinden farklı olarak, solundaki ifadeden en az bir tane olmasını gerektirir. Artı işaretinin kuralını şu şekilde aklınızda tutabilirsiniz: "Önceki karakterden en az bir ya da daha fazla eşlemeye çalış."
Soru işareti, yıldız ve artı işaretine niceleyici (quantifier) diyoruz, çünkü onlardan önce gelen ifadenin sayısını doğrudan etkiliyorlar.
Bir önceki yazıda kullandığımız para örneğini biraz değiştirirek ele alalım.
- Bu para belirten metinler farklı hanelere sahip olabilir.
- Virgülle ayrılmış kuruş kısımları olabilir.
- TL, Dolar ya da Euro işaretinden birini barındırır.
Örneğin metnin içerisinde şu çeşit para miktarları olabilir:
- 1000000₺
- 58000,29€
- 680$
Şimdiye kadar öğrendiğimiz bilgilerle bütün para birimlerini yakalayacak bir örüntü yazmaya çalışalım. Aşağıdaki cevabı açmadan önce kendi başınıza bir denemenizi tavsiye ederim.
Test metnini görmek için tıklayın
255000000,00₺
2300€
28,00₺
25,00€
32,5$
1238474,5₺
www.regex101.com sitesindeki metin kısmına yukarıdaki test metnini yazın ve tüm rakamları yakalayacak bir regex yazın. Ardından aşağıdaki cevapla kontrol edin.
Cevabı görmek için tıklayın
[0-9]+,?[0-9]*[₺€$]
Cevap sizinki ile aynı değil mi? Bir önemi yok. Unutmayın ki regex ile bir sorunu farklı örüntülerle çözmek mümkün.
Yukarıdaki cevabı parça parça inceleyelim.
[0-9]+ ifadesi ile bir karakter sınıfı içerisinde bir sayı aralığı belirttik ve bunu niceledik. [0-9] ifadesi 0'dan 9'a kadar olan herhangi bir rakam yerine geçebilir. Hemen yanına koyduğumuz + ifadesi ise, bu rakamlardan en az 1 tane ve olabildiğince çok yakalanması anlamına geliyor. Bu kısım bilhassa kaç haneli olduğunu bilmediğimiz paranın tam kısmını yakalamak için çok uygun.
,? ifadesi ise paranın küsüratlı kısmını belirtmek için oldukça uygun. Para belirten bir metnin tek bir küsürat kısmı olacağından yalnızca tek bir virgül içermesini bekleriz. Her paranın da küsüratı olmayacağı için bunu opsiyonel kıldık.
[0-9]* kısmı ise küsüratlı kısmı belirtiyor. Küsüratlı kısım da opsiyonel bir kısım olduğu için burada + kullanmak mantıklı olmazdı. Çünkü unutmayalım ki + işareti en az 1 tane eşleşme bulmayı bekliyor. Burada soru işareti kullanmama sebebimiz ise küsüratlı kısmın kaç haneden oluşacağını bilmememiz.
[₺€$] ile de bu üç para biriminden herhangi birinin rakamın sağında yer alması gerektiğini belirtiyoruz.
Bu üç niceleyicinin dışında bir de son olarak belirli aralık niceleyicimizden bahsetmek istiyorum.
Örnek kullanımlarını inceleyelim:
[0-9]{3}=> Tam olarak içerideki rakam kadar tekrarlanmasını bekler. Bu örnekte 325, 678 rakamlarını yakalar ancak 22 ya da 12321312 rakamını yakalamaz.[0-9]{2,5}=> Virgülün solunu minimum tekrar olarak, sağını ise maksimum tekrar olarak kabul eder. Bu örnekte 22, 345, 6754 veya 12311 rakamlarını yakalar ama 123123123 ve 8 rakamlarını yakalamaz.[0-9]{,3}=> Virgülün solunda rakam verilmemişse minimum değeri 0 kabul eder. Minimum değer 0 olduğunda, ifade opsiyonel hâle gelir. Yani bu örnekte en fazla üç haneli bir rakam yakalar ama hiç rakam yoksa da pozitif döner.
