Bagaimana saya bisa mengekstraksi substring dari dalam string di Ruby?
Contoh:
String1 = "<name> <substring>"
Saya ingin mengekstrak substring
dari String1
(yaitu segala sesuatu dalam kemunculan terakhir dari <
dan >
).
Bagaimana saya bisa mengekstraksi substring dari dalam string di Ruby?
Contoh:
String1 = "<name> <substring>"
Saya ingin mengekstrak substring
dari String1
(yaitu segala sesuatu dalam kemunculan terakhir dari <
dan >
).
Jawaban:
String1.scan(/<([^>]*)>/).last.first
scan
menciptakan sebuah array yang, untuk masing-masing <item>
in String1
berisi teks antara <
dan >
dalam array satu elemen (karena ketika digunakan dengan regex yang berisi grup penangkap, pemindaian menciptakan sebuah array yang berisi tangkapan untuk setiap pertandingan). last
memberi Anda yang terakhir dari array itu dan first
kemudian memberi Anda string di dalamnya.
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
Tidak perlu digunakan scan
, jika kita hanya butuh satu hasil.
Tidak perlu menggunakan Python match
, ketika kita memiliki Ruby String[regexp,#]
.
Lihat: http://ruby-doc.org/core/String.html#method-i-5B-5D
catatan: str[regexp, capture] → new_str or nil
if we need only one result
solusi saya. Dan match()[]
lebih lambat, karena itu dua metode, bukan satu.
string[regex]
bisa sama terbaca dalam skenario ini, jadi itulah yang saya gunakan secara pribadi.
Anda dapat menggunakan ekspresi reguler untuk itu dengan mudah ...
Mengizinkan spasi di sekitar kata (tetapi tidak disimpan):
str.match(/< ?([^>]+) ?>\Z/)[1]
Atau tanpa spasi diizinkan:
str.match(/<([^>]+)>\Z/)[1]
<>
benar-benar harus menjadi hal terakhir dalam string. Jika mis. String foo <bar> baz
dibolehkan (dan seharusnya memberikan hasilnya bar
), ini tidak akan berfungsi.
Berikut ini pendekatan yang sedikit lebih fleksibel menggunakan match
metode ini. Dengan ini, Anda dapat mengekstraksi lebih dari satu string:
s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)
# Use 'captures' to get an array of the captures
matchdata.captures # ["ants","pants"]
# Or use raw indices
matchdata[0] # whole regex match: "<ants> <pants>"
matchdata[1] # first capture: "ants"
matchdata[2] # second capture: "pants"