it-swarm-id.com

Cocokkan semua kemunculan regex

Apakah ada cara cepat untuk menemukan setiap kecocokan ekspresi reguler di Ruby? Saya telah melihat melalui objek Regex di Ruby STL dan mencari di Google tanpa hasil.

566
Chris Bunch

Menggunakan scan harus melakukan trik:

string.scan(/regex/)
796
Jean

Untuk menemukan semua string yang cocok, Gunakan scan metode kelas String.

str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]

Jika Anda lebih suka MatchData yang merupakan jenis objek yang dikembalikan oleh, match metode Regexp kelas, gunakan yang berikut

str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]

Keuntungan memiliki MatchData adalah Anda dapat menggunakan metode seperti offset

match_datas = str.to_enum(:scan, /\d+/).map { Regexp.last_match }
match_datas[0].offset(0)
#=> [2, 4]
match_datas[1].offset(0)
#=> [7, 8]

Rujuk juga pertanyaan ini jika Anda ingin tahu lebih banyak
Bagaimana cara saya mendapatkan data kecocokan untuk semua kemunculan Ruby ekspresi reguler dalam sebuah string?
Pencacah pencocokan ekspresi reguler Ruby dengan nama capture capture
Cara mengetahui titik awal untuk setiap kecocokan di Ruby

Membaca tentang variabel khusus $&, $', $1, $2 dalam Ruby akan sangat membantu.

62
sudo bangbang

jika Anda memiliki regexp dengan grup:

str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/

Anda menggunakan pemindaian metode string untuk menemukan grup yang cocok:

str.scan re
#> [["54"], ["1"], ["3"]]

Untuk menemukan pola yang cocok:

str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]
11
MVP