Karena sudah berkomitmen untuk mendalami Ruby, saya berapi-api mencari resource yang bisa meningkatkan skill saya untuk menjadi Rubyist yang jauh lebih baik, syukur-syukur sampai tahap dewa.
Dalam secuil proses mencari itu saya nemu informasi yang melengkapi apa yang sudah saya tahu sebelumnya. Ternyata yang saya tahu tentang method gsub
itu baru sedikit. Ga nyangka kalau method ini bisa bertingkah seperti itu.
Setahu saya, gsub
hanya sebatas digunakan untuk mengganti kata atau kalimat atau bahkan pola dengan sesuatu yang sudah kita tentukan. Misalnya seperti ini.
1 2 3 4 5 |
text = 'hari ini hari wednesday' puts text.gsub('wednesday', 'Rabu') #=> hari ini hari Rabu |
Dengan pengetahuan ini, secara alami jika kita mempunyai teks seperti ini
1 2 3 |
Hari ini adalah hari wednesday Besok adalah thursday Dan besoknya lagi friday |
dan ingin mengganti nama hari yang tertulis dalam bahasa Inggris menjadi bahasa Indonesia dengan bantuan hash sebagai berikut
1 2 3 4 5 |
transformer = { 'wednesday' => 'Rabu', 'thursday' => 'Kamis', 'friday' => 'Jumat' } |
yang terpikirkan oleh kita adalah dengan menggunakan sebuah perulangan. Iya atau tidak?
Secara default kita akan langsung mikir untuk menggunakan perulangan. Implementasinya adalah seperti ini.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
text = <<EOF Hari ini adalah hari wednesday Besok adalah thursday Dan besoknya lagi friday EOF transformer = { 'wednesday' => 'Rabu', 'thursday' => 'Kamis', 'friday' => 'Jumat' } transformer.each do |key, value| text = text.gsub(key, value) end #=> Hari ini adalah hari Rabu Besok adalah Kamis Dan besoknya lagi Jumat |
Hasilnya tentu saja seperti yang kita inginkan. Akan tetapi, adakah cara lain yang bisa digunakan selain perulangan namun masih tetap menggunakan gsub
?
Kalau kamu berpikir mustahil berarti tulisan ini memang cocok untukmu, jodoh nih 😉
Masalah utama yang sepertinya dialami oleh pemula seperti saya tentang method gsub
adalah, mengira parameter-parameter yang diterima adalah string. Padahal, pola regex juga bisa.
Dengan regex, method gsub
akan menangkap semua pola yang diberikan tanpa harus menggunakan perulangan. Contoh sederhananya adalah begini.
1 2 3 4 5 6 7 |
text = 'hari ini hari Rabu' text = text.gsub(/\w+/) do |match| match + 'xxx' end #=> harixxx inixxx harixxx Rabuxxx |
Kode di atas mencari susunan karakter yang memenuhi pola untuk diganti dengan susunan karakter itu sendiri ditambahi 3 x di belakangnya. Pola regex yang dicari dari contoh ini adalah karakter-karakter yang membentuk sebuah kata. Oleh karena itu, setiap akhir kata menjadi diimbuhi 3 huruf x.
Sekarang bagimana untuk kasus kita tadi?
Bimsalabim jadi apa prok prok prok.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
text = <<EOF Hari ini adalah hari wednesday Besok adalah thursday Dan besoknya lagi friday EOF transformer = { 'wednesday' => 'Rabu', 'thursday' => 'Kamis', 'friday' => 'Jumat' } keys = transformer.keys.join('|') #=> wednesday|thursday|friday pattern = Regexp.new(keys) #=> /wednesday|thursday|friday/ text = text.gsub(pattern) { |match| transformer[match] } #=> Hari ini adalah hari Rabu Besok adalah Kamis Dan besoknya lagi Jumat |
|
di regex digunakan untuk menyatakan atau.
Ternyata selain bisa string dan regex, khusus untuk parameter kedua, bisa juga berupa hash. Jika parameter kedua berupa hash maka setiap pola yang cocok akan diganti dengan nilai dari hash yang memiliki kunci pola yang cocok tersebut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
text = <<EOF Hari ini adalah hari wednesday Besok adalah thursday Dan besoknya lagi friday EOF transformer = { 'wednesday' => 'Rabu', 'thursday' => 'Kamis', 'friday' => 'Jumat' } keys = transformer.keys.join('|') #=> wednesday|thursday|friday pattern = Regexp.new(keys) #=> /wednesday|thursday|friday/ text = text.gsub(pattern, transformer) #=> Hari ini adalah hari Rabu Besok adalah Kamis Dan besoknya lagi Jumat |
Cool kan? 😉
Belajar hal-hal dasar yang keren seperti ini justru membuat saya senang karena gimana mau jadi dewa kalau yang dasar seperti ini saja terlewatkan hehehe.
Pasti nanti sepanjang saya belajar akan nemu ilmu yang aneh-aneh lagi dan tentunya akan selalu saya sharing.
Happy hacking!