Rubyで正規表現に一致するものをすべて見つける簡単な方法はありますか?私はRuby STLでRegexオブジェクトを調べて、役に立たないようにGoogleで検索した。
scan
を使うとうまくいくはずです。
string.scan(/regex/)
一致する文字列をすべて検索するには、scan
クラスの String
メソッドを使用します。
str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]
MatchData
クラスのmatch
メソッドによって返されるオブジェクトの型である Regexp
が必要な場合は、次のようにします。
str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]
MatchData
を持つことの利点は、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]
もっと知りたいのであれば、これらの質問も参照してください。
文字列中のすべてのRuby正規表現の一致データを取得するにはどうすればよいですか?
名前付きキャプチャをサポートするRuby正規表現照合列挙子
Rubyでそれぞれの試合の開始点を見つける方法
Rubyで特別な変数$&
、$'
、$1
、$2
を読むことは、とても役に立ちます。
グループを含む正規表現がある場合:
str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/
一致するグループを見つけるには、文字列のスキャン方法を使用します。
str.scan re
#> [["54"], ["1"], ["3"]]
一致パターンを見つけるには:
str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]