Ruby'de Dizeleri Bölme

Kullanıcı girişi tek bir kelime veya sayı değilse, bu girişin Bölünmüş veya dizeler veya sayılar listesine dönüştürülür.

Örneğin, bir program orta ad da dahil olmak üzere tam adınızı sorarsa, önce bu girdiyi üç ayrı bölüme ayırmanız gerekir Teller önce adınız, orta adınız ve soyadınız ile çalışabilmeniz için. Bu, Dize # bölünmüş yöntem.

String # split Nasıl Çalışır

En temel haliyle, Dize # bölünmüş tek bir argüman alır: alan sınırlayıcısını dize olarak. Bu sınırlayıcı çıktıdan kaldırılacak ve sınırlayıcıda bölünmüş bir dizeler dizisi döndürülecektir.

Bu nedenle, aşağıdaki örnekte, kullanıcının adını doğru girdiği varsayılarak, üç öğeli bir Dizi bölünmüş.

#! / usr / bin / env yakut
print "Tam adınız nedir? "
full_name = gets.chomp
name = full_name.split ('')
"Adınız # {name.first}"
"Soyadınız # {name.last}"

Bu programı çalıştırıp bir ad girersek, beklenen bazı sonuçlar alırız. Ayrıca, name.first ve soyadı tesadüflerdir. isim değişken bir Dizive bu iki yöntem çağrısı şuna eşdeğer olacaktır: adı [0] ve adı [-1] sırasıyla.

instagram viewer
$ ruby ​​split.rb
Tam Adın Nedir? Michael C. Morin
İlk adım Michael
Soyadınız Morin

Ancak, Dize # bölünmüş düşündüğünüzden biraz daha akıllı. Eğer argüman Dize # bölünmüş bir dizedir, gerçekten bunu ayırıcı olarak kullanır, ancak argüman tek boşluklu bir dize ise (kullandığımız gibi), daha sonra herhangi bir boşluk alanına bölmek istediğiniz ve önde gelen boşlukları da kaldırmak istediğiniz anlamına gelir.

Yani, eğer biraz

Michael C. Morin

(fazladan boşluklarla), o zaman Dize # bölünmüş yine de beklenenleri yapardı. Bununla birlikte, bir sicim ilk argüman olarak. Düzenli İfade Sınırlayıcılar

İlk argüman olarak normal bir ifade de iletebilirsiniz. Buraya, Dize # bölünmüş biraz daha esnek hale gelir. Ayrıca küçük ismimizi bölme kodunu biraz daha akıllı hale getirebiliriz.

Orta başlangıcın sonunda dönemi istemiyoruz. Bunun orta bir başlangıç ​​olduğunu biliyoruz ve veritabanı orada bir süre istemeyecek, bu yüzden ayrılırken kaldırabiliriz. Ne zaman Dize # bölünmüş normal bir ifadeyle eşleşirse, bir dize sınırlayıcıyla eşleşmiş gibi aynı şeyi yapar: bunu çıktıdan çıkarır ve o noktada böler.

Böylece, örneğimizi biraz geliştirebiliriz:

$ cat split.rb
#! / usr / bin / env yakut
print "Tam adınız nedir? "
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /)
"Adınız # {name.first}"
"Ortadaki baş harfiniz # {name [1]}"
"Soyadınız # {name.last}"

Varsayılan Kayıt Ayırıcı

Yakut Perl gibi dillerde bulabileceğiniz "özel değişkenler" konusunda gerçekten büyük değil, Dize # bölünmüş bilmeniz gereken birini kullanıyor. Bu, varsayılan kayıt ayırıcı değişkendir. $;.

Bu küreseldir, Ruby'de sık görmediğiniz bir şeydir, bu yüzden değiştirirseniz, kodun diğer kısımlarını etkileyebilir; işiniz bittiğinde kodu mutlaka değiştirmeyi unutmayın.

Ancak, bu değişkenin yaptığı ilk argüman için varsayılan değer Dize # bölünmüş. Varsayılan olarak, bu değişken sıfır. Ancak, Dize # bölünmüş'nin ilk argümanı sıfır, bunu tek bir boşluk dizesiyle değiştirir.

Sıfır Uzunluk Sınırlayıcılar

Sınırlayıcı, Dize # bölünmüş sıfır uzunluklu bir dize veya normal ifadedir, Dize # bölünmüş biraz farklı davranacak. Orijinal dizeden hiçbir şey kaldırmaz ve her karaktere bölünür. Bu aslında dizeyi, karakter dizisindeki her karakter için bir tane olmak üzere yalnızca bir karakter dizesi içeren eşit uzunlukta bir diziye dönüştürür.

Bu, dize üzerinden yineleme yapmak için yararlı olabilir ve 1.9.x öncesi ve 1.8.7 öncesi (bir 1.9.x'ten özelliklerin sayısı) çoklu bit Unicode karakterler. Ancak, gerçekten yapmak istediğiniz şey bir dize üzerinden yineleniyorsa ve 1.8.7 veya 1.9.x kullanıyorsanız, muhtemelen Dize # each_char yerine.

#! / usr / bin / env yakut
str = "Beni semender etti!"
str.split (''). her biri | c |
c koyar
son

Döndürülen Dizinin Uzunluğunu Sınırlama

Peki ad ayrıştırma örneğimize geri dönersek, birinin soyadında boşluk varsa? Örneğin, Hollanda soyadları genellikle "van" ("veya" from "anlamına gelir) ile başlayabilir.

Sadece 3 element istiyoruz dizi, böylece ikinci argümanı Dize # bölünmüş şimdiye kadar görmezden geldik. İkinci argümanın Fixnum. Bu argüman en fazla pozitifse, dizide birçok öğe doldurulur. Yani bizim durumumuzda, bu argüman için 3'ü geçmek istiyoruz.

#! / usr / bin / env yakut
print "Tam adınız nedir? "
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /, 3)
"Adınız # {name.first}"
"Ortadaki baş harfiniz # {name [1]}"
"Soyadınız # {name.last}"

Bunu tekrar çalıştırıp Hollandaca bir isim verirsek, beklendiği gibi davranacaktır.

$ ruby ​​split.rb
Tam Adın Nedir? Vincent Willem van Gogh
İlk adım Vincent
Ortadaki baş harfiniz Willem
Soyadınız van Gogh

Bununla birlikte, bu argüman negatifse (herhangi bir negatif sayı), o zaman çıkış dizisindeki öğeler ve sondaki sınırlayıcılar, öğenin sonunda sıfır uzunlukta dizeler olarak görünür dizi.

Bu, bu IRB snippet'inde gösterilmiştir:

: 001> "bu, a, test" .plit (',', -1)
=> ["bu", "", "a", "test", "", "", "", ""]