Saat ini saya mencoba rexp string menjadi beberapa variabel. Contoh string:
ryan_string = "RyanOnRails: This is a test"
Saya telah mencocokkannya dengan regexp ini, dengan 3 grup:
ryan_group = ryan_string.scan(/(^.*)(:)(.*)/i)
Sekarang untuk mengakses setiap grup saya harus melakukan sesuatu seperti ini:
ryan_group[0][0] (first group) RyanOnRails
ryan_group[0][1] (second group) :
ryan_group[0][2] (third group) This is a test
Ini sepertinya sangat konyol dan rasanya saya melakukan sesuatu yang salah. Saya berharap dapat melakukan sesuatu seperti ini:
g1, g2, g3 = ryan_string.scan(/(^.*)(:)(.*)/i)
Apakah ini mungkin? Atau apakah ada cara yang lebih baik daripada cara saya melakukannya?
sumber
one, two, three = string.match(/(^.*)(:)(.*)/i).captures
menjadi:one, two, three = string.match(/(^.*)(:)(.*)/i).try(:captures)
&.
operator baru untuk mendapatkannya kembali di jalur dan bahkan menggunakannya dua kali ketika hanya ada satu grup tangkapan. Misalnya ..,string.match(regex)&.captures&.first
Anda dapat menggunakan Match atau = ~ sebagai gantinya yang akan memberi Anda satu kecocokan dan Anda bisa mengakses data kecocokan dengan cara yang sama atau hanya menggunakan variabel kecocokan khusus $ 1, $ 2, $ 3
Sesuatu seperti:
sumber
Anda dapat memberi nama jodoh Anda
Ini tidak berfungsi jika Anda membalik urutan string dan regex.
sumber
Anda harus memutuskan apakah itu ide yang bagus, tetapi ruby regexp dapat (secara otomatis) mendefinisikan variabel lokal untuk Anda!
Saya belum yakin apakah fitur ini keren atau benar-benar gila, tetapi regex Anda dapat menentukan variabel lokal.
(Lihat http://ruby-doc.org/core-2.1.1/Regexp.html , cari "variabel lokal").
Catatan: Seperti yang ditunjukkan dalam komentar, saya melihat bahwa ada jawaban serupa dan sebelumnya untuk pertanyaan ini oleh @toonsend ( https://stackoverflow.com/a/21412455 ). Saya tidak berpikir saya "mencuri", tetapi jika Anda ingin bersikap adil dengan pujian dan kehormatan jawaban pertama, silakan :) Saya harap tidak ada hewan yang dirugikan.
sumber
scan()
akan menemukan semua kecocokan yang tidak tumpang tindih dari regex dalam string Anda, jadi alih-alih mengembalikan larik grup Anda seperti yang Anda harapkan, ini mengembalikan larik array.Anda mungkin lebih baik menggunakan
match()
, dan kemudian mendapatkan rangkaian tangkapan menggunakanMatchData#captures
:Namun Anda juga bisa melakukan ini
scan()
jika Anda ingin:sumber