Memisahkan string hanya satu cara untuk memanipulasi data string. Anda juga dapat membuat penggantian untuk mengganti satu bagian string dengan string lainnya. Misalnya, dalam contoh string (foo, bar, baz) menggantikan "foo" dengan "boo" di akan menghasilkan "boo, bar, baz." Anda dapat melakukan ini dan banyak hal lainnya menggunakan sub dan gsub metode di kelas string.
Banyak Pilihan untuk Substitusi Ruby
Metode substitusi datang dalam dua varietas. Itu sub Metode adalah yang paling mendasar dari keduanya dan dilengkapi dengan jumlah kejutan paling sedikit. Itu hanya menggantikan contoh pertama dari pola yang ditunjuk dengan penggantian.
Sedangkan sub hanya menggantikan instance pertama, the gsub Metode menggantikan setiap instance dari pola dengan penggantian. Selain itu, keduanya sub dan gsub memiliki sub! dan gsub! rekan-rekan. Ingat, metode dalam Rubi yang berakhir pada tanda seru mengubah variabel di tempat alih-alih mengembalikan salinan yang dimodifikasi.
Cari dan Ganti
Penggunaan paling mendasar dari metode substitusi adalah mengganti satu string pencarian statis dengan satu string pengganti statis. Dalam contoh di atas, "foo" diganti dengan "boo." Ini dapat dilakukan untuk kemunculan pertama "foo" dalam string menggunakan
sub metode atau dengan semua kemunculan "foo" menggunakan gsub metode.#! / usr / bin / env ruby
a = "foo, bar, baz"
b = a.sub ("foo", "boo")
menempatkan b
$ ./1.rb
foo, bar, baz
gsub $ ./1.rb
boo, bar, baz
Pencarian Fleksibel
Mencari string statis hanya bisa sejauh ini. Akhirnya, Anda akan mengalami kasus di mana subset dari string atau string dengan komponen opsional perlu dicocokkan. Metode substitusi dapat, tentu saja, cocok dengan ekspresi reguler daripada string statis. Ini memungkinkan mereka untuk menjadi jauh lebih fleksibel dan mencocokkan hampir semua teks yang dapat Anda impikan.
Contoh ini adalah dunia yang sedikit lebih nyata. Bayangkan satu set nilai yang dipisahkan koma. Nilai-nilai ini dimasukkan ke dalam program tabulasi di mana Anda tidak memiliki kontrol (ditutup sumber). Program yang menghasilkan nilai-nilai ini juga merupakan sumber tertutup, tetapi menghasilkan beberapa data yang berformat buruk. Beberapa bidang memiliki spasi setelah koma dan ini menyebabkan program tabulator rusak.
Salah satu solusi yang mungkin adalah menulis program Ruby untuk bertindak sebagai "lem," atau filter, di antara kedua program. Program Ruby ini akan memperbaiki masalah apa pun dalam format data sehingga tabulator dapat melakukan tugasnya. Untuk melakukan ini, cukup sederhana: ganti koma diikuti oleh sejumlah spasi hanya dengan koma.
#! / usr / bin / env ruby
STDIN. Setiap melakukan | l |
l.gsub! (/, + /, ",")
menempatkan l
akhir
gsub $ cat data.txt
10, 20, 30
12.8, 10.4,11
gsub $ cat data.txt | ./2.rb
10,20,30
12.8,10.4,11
Penggantian Fleksibel
Sekarang bayangkan situasi ini. Selain pemformatan minor kesalahan, program yang menghasilkan data menghasilkan angka data dalam notasi ilmiah. Program tabulator tidak mengerti ini, jadi Anda harus menggantinya. Jelas, gsub sederhana tidak akan dilakukan di sini karena penggantian akan berbeda setiap kali penggantian dilakukan.
Untungnya, metode substitusi dapat menghalangi argumen substitusi. Untuk setiap kali string pencarian ditemukan, teks yang cocok dengan string pencarian (atau regex) diteruskan ke blok ini. Nilai yang dihasilkan oleh blok digunakan sebagai string pengganti. Dalam contoh ini, angka floating point dalam bentuk notasi ilmiah (seperti 1.232e4) dikonversi ke angka normal dengan titik desimal. String dikonversi menjadi angka dengan to_f, kemudian nomor tersebut diformat menggunakan format string.
#! / usr / bin / env ruby
STDIN. Setiap melakukan | l |
l.gsub! (/-?\d+\.\d+e-?\d+/) lakukan | n |
"% .3f"% n.to_f
akhir
l.gsub! (/, + /, ",")
menempatkan l
akhir
gsub $ cat floatdata.txt
2.215e-1, 54, 11
3.15668e6, 21, 7
gsub $ cat floatdata.txt | ./3.rb
0.222,54,11
3156680.000,21,7
Tidak Mengenal Ekspresi Reguler?
Mari kita mundur dan melihat itu ekspresi reguler. Itu terlihat samar dan rumit, tetapi sangat sederhana. Jika Anda tidak terbiasa dengan ekspresi reguler, mereka bisa sangat samar. Namun, begitu Anda terbiasa dengan mereka, itu adalah metode yang mudah dan alami untuk menggambarkan teks. Ada sejumlah elemen, dan beberapa elemen memiliki bilangan.
Elemen utama di sini adalah \ d kelas karakter. Ini akan cocok dengan angka apa pun, karakter 0 hingga 9. Kuantifier + digunakan dengan kelas karakter digit untuk menandakan bahwa satu atau lebih dari digit ini harus dicocokkan dalam satu baris. Anda memiliki tiga grup digit, dua dipisahkan oleh "."Dan yang lainnya dipisahkan oleh surat"e"(untuk eksponen).
Elemen kedua yang melayang adalah karakter minus, yang menggunakan "?"kuantifier. Ini berarti "nol atau satu" dari elemen-elemen ini. Jadi, singkatnya, mungkin ada atau tidak ada tanda-tanda negatif di awal angka atau eksponen.
Dua elemen lainnya adalah. (periode) karakter dan e karakter. Gabungkan semua ini, dan Anda mendapatkan ekspresi reguler (atau seperangkat aturan untuk teks yang cocok) yang cocok dengan angka dalam bentuk ilmiah (seperti 12.34e56).