Ruby'de String, metin ya da ikili veri taşıyan bir bayt dizisidir ve varsayılan olarak değiştirilebilir (mutable). Çift tırnaklı string içinde #{...} ile değer gömersiniz, s[0, 3] veya s[1..] ile parça alırsınız. sub ilk eşleşmeyi, gsub bütün eşleşmeleri değiştirir; split parçalara ayırır, strip baştaki ve sondaki boşlukları atar. upcase ve downcase büyük-küçük harf dönüştürür; Türkçe İ ve ı için :turkic seçeneği gerekir.
Bu yazıda string oluşturma ve gömme (interpolation), dilimleme, değiştirme, bölme, kırpma, hizalama ve biçimlendirme metotlarını Ruby 4.0 ile çalıştırılmış örneklerle anlatıyoruz. Son bölümde değiştirilebilir ve dondurulmuş (frozen) string farkına değiniyoruz. Serinin tamamı için Ruby öğrenme rehberine bakabilirsiniz.
String oluşturma ve gömme (interpolation)

Çift tırnaklı string'lerde #{...} içine yazdığınız herhangi bir ifade çalıştırılır ve sonucu metne eklenir. Tek tırnaklı string'ler gömme yapmaz ve kaçış dizilerinin çoğunu (\n gibi) işlemez; yalnızca \' ve \\ tanınır. Belgeler gömülen ifadeyi okunabilirlik için kısa tutmayı önerir.
ad = "Zeynep"
"Merhaba #{ad}!" # => "Merhaba Zeynep!"
'Merhaba #{ad}!' # => "Merhaba \#{ad}!"
"Toplam: #{2 + 3}" # => "Toplam: 5"
"satır1\nsatır2".lines.size # => 2
'satır1\nsatır2'.lines.size # => 1
"ab" + "cd" # => "abcd"
"ha" * 3 # => "hahaha"Çok satırlı metinler için heredoc (<<~METIN) ve %q, %Q gibi diğer literal biçimleri veri tipleri ve literaller yazısında anlatılıyor.
Dilimleme: [], slice, length ve bytesize
String indeksleri bayt değil karakter üzerinden çalışır; Türkçe harfler de tek karakter sayılır. Dizilerde olduğu gibi negatif indeks sondan sayar, başlangıç ve uzunluk çifti ya da aralık verebilirsiniz. length karakter sayısını, bytesize bayt sayısını verir; UTF-8'de İ, ş, ğ gibi harfler birden fazla bayt kaplar.
s = "İstanbul"
s[0] # => "İ"
s[-1] # => "l"
s[0, 3] # => "İst"
s[1..3] # => "sta"
s[3..] # => "anbul"
s[20] # => nil
s["tan"] # => "tan"
s.length # => 8
s.bytesize # => 9
s.chars.first(3) # => ["İ", "s", "t"]Karakter, bayt ve kodlama arasındaki ilişkiyi Ruby encoding ve UTF-8 yazısında ayrıntılı ele alıyoruz.
Değiştirme: sub ve gsub
sub desenin ilk eşleşmesini, gsub bütün eşleşmelerini değiştirir ve ikisi de yeni bir string döndürür. Desen bir string olabilir (bu durumda düzenli ifade karakterleri sıradan karakter sayılır) ya da bir Regexp. Değiştirme değeri olarak string, hash veya blok verebilirsiniz. String değiştirme içinde \1 gibi geri başvurular yakalanan grubu ifade eder.
tarih = "2026-11-07"
tarih.sub("-", "/") # => "2026/11-07"
tarih.gsub("-", "/") # => "2026/11/07"
tarih.gsub(/\d+/) { |parca| parca.to_i.to_s } # => "2026-11-7"
"kedi köpek".gsub(/[aeıioöuü]/, "*") # => "k*d* k*p*k"
"ad soyad".gsub(/(\w+)/, '<\1>') # => "<ad> <soyad>"
"kırmızı".gsub(/[ıi]/, "ı" => "i", "i" => "ı") # => "kirmizi"
'1+1'.gsub('+', ' artı ') # => "1 artı 1"Son satırda desen bir string olduğu için + düzenli ifade operatörü değil, sıradan bir karakter olarak ele alınır. Düzenli ifadelerin kendisi Ruby Regexp yazısında anlatılıyor.
Bölme ve kırpma: split, strip ve Ruby 4.0 seçicileri

split argümansız ya da tek boşlukla (" ") çağrıldığında ardışık boşlukları tek ayırıcı sayar ve baştaki boşluğu yok sayar. Başka bir ayırıcı verdiğinizde boş alanlar korunur. İkinci argüman parça sayısını sınırlar. strip, lstrip ve rstrip boşlukları (boşluk, sekme, satır sonu, NUL gibi) kırpar.
" çok boşluk ".split # => ["çok", "boşluk"]
"elma, armut ,kiraz".split(",") # => ["elma", " armut ", "kiraz"]
"elma, armut ,kiraz".split(",").map(&:strip) # => ["elma", "armut", "kiraz"]
"a,b,,c".split(",") # => ["a", "b", "", "c"]
"a,b,c".split(",", 2) # => ["a", "b,c"]
"çay".split("") # => ["ç", "a", "y"]
" merhaba \n".strip # => "merhaba"
%w[a b c].join(", ") # => "a, b, c"Ruby 4.0 NEWS dosyasına göre strip, lstrip, rstrip ve ünlemli sürümleri artık karakter seçici argümanları kabul ediyor. Böylece boşluk dışındaki karakterleri de iki uçtan kırpabilirsiniz. Seçiciler count ve delete metotlarındaki gibi aralık ("0-9") ve olumsuzlama ("^...") destekler. Önceki sürümlerde bu metotlar argüman almadığı için aşağıdaki kod yalnızca Ruby 4.0 ve sonrasında çalışır.
"---başlık---".strip("-") # => "başlık"
"xxabcxx".lstrip("x") # => "abcxx"
"xxabcxx".rstrip("x") # => "xxabc"
"01234abc56789".strip("0-9") # => "abc"Büyük-küçük harf ve Türkçe karakterler
upcase, downcase, capitalize ve swapcase varsayılan olarak tam Unicode eşlemesi kullanır; ç, ğ, ö, ş, ü doğru dönüşür. Sorun noktalı/noktasız i harfindedir: Unicode varsayılanında küçük i büyüyünce noktasız I olur, büyük I küçülünce noktalı i olur. Türkçe ve Azerice kurallar için metoda :turkic argümanını verin.
"çağrı".upcase # => "ÇAĞRI"
"istanbul".upcase # => "ISTANBUL"
"istanbul".upcase(:turkic) # => "İSTANBUL"
"IŞIK".downcase # => "işik"
"IŞIK".downcase(:turkic) # => "ışık"
"ırmak".capitalize # => "Irmak"
"Ali".swapcase # => "aLI"
"Gül".casecmp?("GÜL") # => true
"Çağrı".casecmp?("ÇAĞRI") # => false
"Çağrı".downcase(:turkic) == "ÇAĞRI".downcase(:turkic) # => trueHizalama ve biçimlendirme: center, ljust, rjust, format ve %
ljust, rjust ve center string'i verilen genişliğe kadar doldurur; doldurma karakteri varsayılan olarak boşluktur. Genişlik karakter sayısıyla ölçülür. Sayıları biçimlendirmek için format (diğer adı sprintf) ya da % operatörü kullanılır; birden fazla değer için dizi, adlandırılmış alanlar için hash verilir.
"Ürün".ljust(10, ".") + "15 TL" # => "Ürün......15 TL"
"7".rjust(3, "0") # => "007"
"başlık".center(12, "*") # => "***başlık***"
format("%-8s|%6.2f", "kalem", 15.5) # => "kalem | 15.50"
"%05d" % 42 # => "00042"
"%s adet %s" % [3, "elma"] # => "3 adet elma"
"Merhaba %{ad}" % {ad: "Deniz"} # => "Merhaba Deniz"Bütün biçim belirteçleri (%d, %f, %x, genişlik ve hassasiyet) belgelerdeki Format Specifications sayfasında listelenir.
Sorgulama: start_with?, end_with?, include?
start_with? ve end_with? birden fazla aday alabilir ve herhangi biri eşleşirse true döner. start_with? düzenli ifade de kabul eder. delete_prefix ve delete_suffix ön eki veya son eki yalnızca gerçekten varsa siler.
dosya = "rapor_2026.csv"
dosya.start_with?("rapor") # => true
dosya.start_with?(/r\w+_/) # => true
dosya.end_with?(".tsv", ".csv") # => true
dosya.include?("2026") # => true
dosya.delete_suffix(".csv") # => "rapor_2026"
dosya.index("_") # => 5
dosya.count("0-9") # => 4Karakter ve satır üzerinde gezinme: chars, lines, scan, each_char
Bir string'i karakter karakter işlemek için chars (dizi döndürür) ya da each_char (bloğa verir) kullanılır. lines metni satır sonlarından böler ve satır sonunu parçada bırakır; atmak için chomp: true verin. scan bir desenin bütün eşleşmelerini toplar. reverse, squeeze ve tr da sık kullanılan dönüştürmelerdir.
metin = "bir\niki\nüç"
metin.lines # => ["bir\n", "iki\n", "üç"]
metin.lines(chomp: true) # => ["bir", "iki", "üç"]
"Fiyat: 15 TL, KDV: 3 TL".scan(/\d+/) # => ["15", "3"]
"ağaç".chars # => ["a", "ğ", "a", "ç"]
"ağaç".reverse # => "çağa"
"çoook boşluk".squeeze # => "çok boşluk"
"şeker".tr("ş", "s") # => "seker"
"kek".each_char { |c| print c.upcase }
puts # çıktı: KEKKarakter dizilerini map, select ya da tally ile işlemek için Enumerable yazısına bakabilirsiniz; örneğin "elma".chars.tally her harfin kaç kez geçtiğini verir.
Değiştirilebilir ve dondurulmuş string
String metotlarının çoğunun iki sürümü vardır: ünlemsiz olan yeni bir string döndürür, ünlemli olan (upcase!, gsub!, strip!) string'in kendisini değiştirir. Ünlemli sürümler değişiklik olmadığında nil döndürür. << de string'i yerinde uzatır; + ise yeni bir nesne üretir.
s = String.new("abc")
s << "def" # => "abcdef"
s.upcase! # => "ABCDEF"
s.upcase! # => nil
s # => "ABCDEF"
t = "sabit".freeze
t.frozen? # => true
begin
t << "!"
rescue FrozenError => e
puts e.message # çıktı: can't modify frozen String: "sabit"
end
u = +t
u << "!" # => "sabit!"
t # => "sabit"+string (tekli artı), string dondurulmuşsa değiştirilebilir bir kopyasını, değilse kendisini döndürür. -string (diğer adı dedup) ise dondurulmuş bir sürüm verir. Ruby 3.4 NEWS dosyasına göre # frozen_string_literal yorumu olmayan dosyalarda string literallerini değiştirmek, uyarılar açıkken (-W:deprecated) bir kullanımdan kaldırma uyarısı üretir; bu, literallerin ileride varsayılan olarak dondurulmasına hazırlıktır. Konunun tamamı frozen string ve freeze yazısında.
Yaygın hatalar

- Ünlemli metodun sonucunu atamak:
ad = ad.strip!satırı, kırpılacak boşluk yoksaaddeğişkenininilyapar. - Türkçe metinde düz downcase: "I" harfi "i" olur.
:turkicargümanını kullanın. - Tek tırnakta gömme beklemek:
'#{ad}'olduğu gibi kalır; gömme için çift tırnak gerekir. - split(",") sonrasında boşlukları unutmak: virgülden sonraki boşluklar parçaların içinde kalır;
map(&:strip)ekleyin. - bytesize ile karakter saymak: UTF-8'de Türkçe harfler iki bayt olabilir; karakter sayısı için
lengthkullanın.
Sık Sorulan Sorular
String ile Symbol arasındaki fark nedir?
String metin veya veri taşır ve değiştirilebilir; Symbol bir tanımlayıcıyı (ad) temsil eder ve aynı ad için program boyunca aynı nesnedir. Ayrıntılar Symbol ve String farkı yazısında.
<code>+</code> ile <code><<</code> hangisini kullanmalıyım?
+ her seferinde yeni bir string üretir, iki taraf da değişmez. << soldaki string'i yerinde uzatır. Döngüde büyük bir metin biriktiriyorsanız << ara kopya oluşturmaz; ama string dondurulmuşsa FrozenError verir.
Ruby 4.0 String için ne değiştirdi?
NEWS dosyasına göre Unicode desteği 17.0.0 sürümüne, emoji desteği 17.0 sürümüne güncellendi ve strip ailesi karakter seçici argümanları almaya başladı. Diğer değişiklikler için Ruby 4.0 yenilikler yazısına bakın.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: Ruby öğrenme rehberi · Symbol ve String farkı · Frozen string ve freeze · Encoding ve Türkçe karakter · Ruby Regexp · Regex başlangıç rehberi