Saya tahu bahwa saya dapat menulis pernyataan kasus Ruby untuk memeriksa kecocokan dengan ekspresi reguler. Namun, saya ingin menggunakan data pertandingan dalam pernyataan pengembalian saya. Sesuatu seperti semi-pseudocode ini:
foo = "10/10/2011"
case foo
when /^([0-9][0-9])/
print "the month is #{match[1]}"
else
print "something else"
end
Bagaimana saya bisa mencapai itu?
Terima kasih!
Sekadar catatan: Saya mengerti bahwa saya tidak akan pernah menggunakan pernyataan switch untuk kasus sederhana seperti di atas, tetapi itu hanya satu contoh. Pada kenyataannya, yang saya coba capai adalah mencocokkan banyak ekspresi reguler potensial untuk sebuah tanggal yang dapat ditulis dalam berbagai cara, dan kemudian menguraikannya dengan kelas Ruby Date yang sesuai.
ruby
regex
switch-statement
Yuval Karmi
sumber
sumber
Jawaban:
Referensi ke grup pencocokan ekspresi reguler selalu disimpan dalam variabel pseudo
$1
untuk$9
:case foo when /^([0-9][0-9])/ print "the month is #{$1}" else print "something else" end
Anda juga dapat menggunakan
$LAST_MATCH_INFO
variabel pseudo untuk melihat keseluruhanMatchData
objek. Ini bisa berguna saat menggunakan tangkapan bernama:case foo when /^(?<number>[0-9][0-9])/ print "the month is #{$LAST_MATCH_INFO['number']}" else print "something else" end
sumber
$1
,$2
...$9
atauRegexp.last_match(1)
seperti yang direkomendasikan oleh rubocopBerikut adalah pendekatan alternatif yang memberi Anda hasil yang sama tetapi tidak menggunakan sakelar. Jika Anda meletakkan ekspresi reguler Anda dalam sebuah array, Anda dapat melakukan sesuatu seperti ini:
res = [ /pat1/, /pat2/, ... ] m = nil res.find { |re| m = foo.match(re) } # Do what you will with `m` now.
Mendeklarasikan di
m
luar blok memungkinkannya untuk tetap tersedia setelahfind
selesai dengan blok danfind
akan berhenti segera setelah blok mengembalikan nilai sebenarnya sehingga Anda mendapatkan perilaku pintasan yang sama dengan yang diberikan oleh sakelar. Ini memberi Anda sepenuhnyaMatchData
jika Anda membutuhkannya (mungkin Anda ingin menggunakan grup penangkapan bernama di regex Anda) dan dengan baik memisahkan regex Anda dari logika pencarian Anda (yang mungkin atau mungkin tidak menghasilkan kode yang lebih jelas), Anda bahkan dapat memuat regex Anda dari config file atau pilih yang mana yang Anda inginkan pada waktu proses.sumber
case
pendekatan ini. Mungkin Anda ingin menggunakan pendekatan mu dalam skenario berulir, daripada variabel global dengan pendekatan kasus (?)