it-swarm-tr.com

Bir regex'in tüm oluşumlarını eşleştir

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.

566
Chris Bunch

scan kullanarak numarayı yapmalısınız:

string.scan(/regex/)
796
Jean

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.

62
sudo bangbang

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"]
11
MVP