Ruby'de normal bir ifadenin her eşleşmesini bulmanın hızlı bir yolu var mı? Ruby STL'deki Regex nesnesini inceledim ve Google'da boşuna arama yaptım.
Ruby'de normal bir ifadenin her eşleşmesini bulmanın hızlı bir yolu var mı? Ruby STL'deki Regex nesnesini inceledim ve Google'da boşuna arama yaptım.
Yanıtlar:
Kullanarak scan
hile yapmak gerekir:
string.scan(/regex/)
/(?=(...))/
.
Eşleşen tüm dizeleri bulmak için Dize kullanın scan
yöntemini .
str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]
İsterseniz MatchData
, Regexp tarafından döndürülen nesnenin türü budurmatch
yöntem, kullanım:
str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]
Kullanmanın avantajı MatchData
sizin gibi yöntemleri kullanabilirsiniz olmasıdıroffset
:
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 şu sorulara bakın:
Özel değişkenlerle ilgili okuma $&
, $'
, $1
, $2
Ruby çok yararlı olacaktır.
gruplarla normal ifadeniz varsa:
str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/
scan
eşleşen grupları bulmak için String'in yöntemini kullanabilirsiniz:
str.scan re
#> [["54"], ["1"], ["3"]]
Eşleşen kalıbı bulmak için:
str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]
str.scan(/\d+[m-t]/) # => ["54m", "1t", "3r"]
daha deyimselstr.to_enum(:scan,re).map {$&}
/(\d+)[m-t]/
değil /\d+[m-t]/
: re = /(\d+)[m-t]/; str.scan(re)
aynı str.scan(/(\d+)[mt]/)
ama #> alıyorum [["" 54 "], [" 1 "], [" 3 "]]
ve değil "54m", "1t", "3r"]
. Soru şuydu: bir grupla düzenli bir ifadem varsa ve ifadesini (gruptan ayrılmak) nasıl yapabilirim? Bu anlamda, şifreli ve okunması zor olsa da olası bir çözüm şöyleydi:str.to_enum(:scan,re).map {$&}
Kullanabilirsiniz string.scan(your_regex).flatten
. Normal ifadeniz grup içeriyorsa, tek bir düz dizide dönecektir.
string = "A 54mpl3 string w1th 7 numbers scatter3r ar0und"
your_regex = /(\d+)[m-t]/
string.scan(your_regex).flatten
=> ["54", "1", "3"]
Normal ifade de adlandırılmış bir grup olabilir.
string = 'group_photo.jpg'
regex = /\A(?<name>.*)\.(?<ext>.*)\z/
string.scan(regex).flatten
Ayrıca kullanabilirsiniz gsub
, MatchData istiyorsanız sadece bir yol daha.
str.gsub(/\d/).map{ Regexp.last_match }
your_regex = /(\d+)[m-t]/
kullanmanıza gerek yoktur flatten
. Son örnekte, last_match
bu durumda muhtemelen güvenli olan, ancak genel olan ve aramadan önce herhangi bir normal ifade eşleştirildiyse üzerine yazılabilen kullanım örnekleri kullanılır last_match
. Bunun yerine , desene ve ihtiyaçlara bağlı olarak kullanımı daha güvenli string.match(regex).captures # => ["group_photo", "jpg"]
veya string.scan(/\d+/) # => ["54", "3", "1", "7", "3", "0"]
diğer cevaplarda gösterildiği gibi.