web-dev-qa-db-ja.com

すべての正規表現に一致

Rubyで正規表現に一致するものをすべて見つける簡単な方法はありますか?私はRuby STLでRegexオブジェクトを調べて、役に立たないようにGoogleで検索した。

558
Chris Bunch

scan を使うとうまくいくはずです。

string.scan(/regex/)
787
Jean

一致する文字列をすべて検索するには、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を読むことは、とても役に立ちます。

57
sudo bangbang

グループを含む正規表現がある場合:

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