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 scanhile 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ı MatchDatasizin 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, $2Ruby çok yararlı olacaktır.
gruplarla normal ifadeniz varsa:
str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/
scaneş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_matchbu 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.