JS String İşlemleri: Dilimleme, Regex ve Temel Manipülasyon
JavaScript'te metin verisiyle çalışmak; kullanıcı girdileri, dosya satırları, URL'ler ve loglar üzerinde işlem yapmak için sık ihtiyaç duyulan bir beceridir. Bu makalede slice(), substring(), split(), replace() ve regex temellerini; template literals ve temizleme (sanitization) teknikleriyle birlikte örnekler üzerinde adım adım açıklıyorum. Temel açıklamalar resmi dokümanlara dayanmaktadır.
Temel dilimleme: slice() vs substring()
İki yaygın dilimleme yöntemi slice(start, end) ve substring(start, end) biçimindedir. Önemli farklar şunlardır:
- slice negatif indeksleri destekler; substring negatif olanları 0 olarak işlemeye meyillidir.
- slice end parametresini dışlayarak sonuna kadar alır; substring de benzer davranır ama negatif ve ters argümanlarda farklı sonuç verir.
Daha teknik açıklamalar için bakınız: https://javascript.info/string.
Hızlı örnekler:
const s = "Merhaba Dünya";
s.slice(0, 7) // "Merhaba"
s.slice(-5) // "Dünya" (negatif indeks)
s.substring(0, 7) // "Merhaba"
Ayırma: split()
split(separator, limit) bir string'i ayırıcıya göre diziye çevirir. Ayırıcı string veya regex olabilir; limit parametresi çıktı dizisinin uzunluğunu sınırlar. (Dokümantasyon: MDN split.)
Örnekler:
"elma,armut,karpuz".split(",") → ["elma","armut","karpuz"]
"satır1\nsatır2".split(/\r?\n/) → satır bazlı dizi
Değiştirme ve regex: replace()
replace(searchValue, replaceValue) tek bir eşleşmeyi değiştirir; global değiştirme için searchValue olarak regex ve /g bayrağı kullanın. replace() aynı zamanda bir fonksiyon alarak her eşleşme için dinamik dönüşüm yapmanıza da olanak sağlar. Temel referans: MDN replace.
Örnekler:
"kitap kitap".replace("kitap", "defter") → "defter kitap" (sadece ilkine etki eder)
"kitap kitap".replace(/kitap/g, "defter") → "defter defter" (tüm eşleşmeler)
"John Doe".replace(/(\w+)\s+(\w+)/, (match, p1, p2) => `${p2}, ${p1}`) → "Doe, John" (yakalama grupları ile dönüşüm)
Regex: Kullanım örnekleri ve bayraklar
Regex, arama, doğrulama ve toplu değiştirme için güçlü bir araçtır. Temel kullanım örnekleri:
- /abc/.test(str) — desenin varlığını boolean olarak döndürür.
- str.match(/\d+/g) — metindeki tüm sayıları dizide toplar.
- s.split(/[;,\s]+/) — birden fazla ayırıcı ile split.
Yaygın bayraklar (flags):
| Bayrak | Anlamı |
|---|---|
| g | Global: Tüm eşleşmeleri hedefler |
| i | Case-insensitive: Büyük/küçük harf duyarsız |
| m | Multiline: ^ ve $ satır başı/sonu davranışı |
| u | Unicode modu |
Regex yöntemleri ve kullanım detayları için: https://javascript.info/regexp-methods.
Template literals ve string temizleme
Template literals (`backticks`) ile değişken gömme (${...}) ve çok satırlı stringler daha okunabilir olur. Örnek:
const name = "Ayşe";
console.log(`Merhaba ${name}! Bugün ${new Date().getDate()} teklifleri var.`)
Temizleme (sanitization) için sık kullanılan adımlar:
- trim() ile baş/son boşlukları kaldırma.
- toLowerCase()/toUpperCase() ile kıyaslama standardı oluşturma.
- Fazla boşlukları tek boşluğa indirgeme: s.trim().replace(/\s+/g, ' ').
- İstenmeyen karakterleri temizlemek için basit bir regex: s.replace(/[^\w\s]/g, '') (sadece temel örnek; tüm durumları kapsamayabilir).
Pratik senaryolar: adım adım
-
Kullanıcı adını e-postadan almak
Adımlar: string'i@karakterinden split edin ve ilk öğeyi alın.
Örnek: const user = "ayse@example.com".split('@')[0] // "ayse" -
Metni güvenli şekilde 100 karaktere kırpma
Adımlar: if (s.length <= 100) return s; else return s.slice(0, 97) + '...' -
CSV satırını temizleyip alanları kırpma
Adımlar: s.split(',').map(f => f.trim()) — karmaşık CSV için özel parser tercih edin. -
Bir metindeki tüm sayıları almak
Adımlar: const nums = s.match(/\d+/g) || []
İpuçları ve iyi uygulamalar
- Basit işler için önce string metodlarını (slice, indexOf, split) düşünün; regex daha esnek ancak karmaşık olabilir.
- Sık kullanılan regex'leri döngü içinde kullanacaksanız dışarıda derleyin (const re = /.../g) — yeniden oluşturmayı önler.
- split ile kolayca çözebileceğiniz durumlar için karmaşık regex yazmaktan kaçının; bakım kolaylığı önemlidir.
- Unicode ve emoji içeren metinlerde indeksleme beklentiniz dışında sonuç verebilir; bu gibi durumlarda özel kütüphaneler veya ek kontroller gerekebilir.
Kısa referans
- slice(start, end) — negatif indeksleri destekler.
- substring(start, end) — negatifleri 0 kabul etme ve argümanları ters çevirme davranışı.
- split(sep, limit) — bir dizi döndürür. (MDN: link)
- replace(pattern, repl) — /g bayrağı ile global değişim; fonksiyonla dinamik dönüşüm. (MDN: link)
Kaynaklar
- javascript.info — Strings
- javascript.info — RegExp yöntemleri
- MDN — String.prototype.replace()
- MDN — String.prototype.split()
- Calmops — Template literals ve string manipülasyonu
Bu rehber temel kullanım senaryolarını kapsar; daha karmaşık ihtiyaçlarda regex desenlerini dikkatle test etmek ve gerekiyorsa hazır kütüphaneler kullanmak iyi bir yaklaşımdır.