Ruby'de düzenli bir ifadenin her eşleşmesini bulmanın hızlı bir yolu var mı? Ruby STL'deki Regex nesnesine baktım ve Google’da boşuna aradım.
scan
kullanarak numarayı yapmalısınız:
string.scan(/regex/)
Eşleşen tüm dizeleri bulmak için, scan
sınıfının String
yöntemini kullanın.
str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]
İsterseniz MatchData
tarafından döndürülen nesnenin türü olarak isterseniz, match
( _ YÖNTEMI __ Regexp
sınıfları, aşağıdakileri kullanın
str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]
MatchData
uygulamasının avantajı, offset
gibi yöntemleri kullanabilmenizdir.
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]
Daha fazla bilgi edinmek istiyorsanız bu sorulara da bakın.
Bir dizedeki bir Ruby normal ifadesinin tüm oluşumları için eşleme verilerini nasıl alabilirim?
Adlı yakalama desteğine sahip yakıcı düzenli ifade eşleme numaralandırıcı
Ruby'deki her bir maç için başlangıç noktası nasıl bulunur
$&
, $'
, $1
, $2
içinde Ruby özelliğinin okunması çok yararlı olacaktır.
eğer grupları olan bir düzenli ifadeniz varsa:
str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/
Eşleşen grupları bulmak için string yöntemi taramasını kullanırsınız:
str.scan re
#> [["54"], ["1"], ["3"]]
Eşleşen deseni bulmak için:
str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]