1. ホーム
  2. ruby

[解決済み] Ruby Regexpのグループマッチ、1行で変数の割り当て

2022-06-26 22:24:16

質問

現在、文字列を複数の変数に展開しようとしています。文字列の例

ryan_string = "RyanOnRails: This is a test"

この正規表現で、3つのグループで照合してみました。

ryan_group = ryan_string.scan(/(^.*)(:)(.*)/i)

さて、各グループにアクセスするには、次のようにしなければなりません。

ryan_group[0][0] (first group) RyanOnRails
ryan_group[0][1] (second group) :
ryan_group[0][2] (third group) This is a test

これはかなり馬鹿げていて、私が何か間違ったことをしているように感じます。私はこのようなことができることを期待しています。

g1, g2, g3 = ryan_string.scan(/(^.*)(:)(.*)/i)

これは可能なのでしょうか?それとも私がやっている方法よりも良い方法があるのでしょうか?

どのように解決するのですか?

あなたは scan はほとんど意味をなさないので、必要ありません。使用できるのは String#match を返します。 MatchData オブジェクトを返すので、次に #captures を呼び出してキャプチャーの配列を返します。このようなものです。

#!/usr/bin/env ruby

string = "RyanOnRails: This is a test"
one, two, three = string.match(/(^.*)(:)(.*)/i).captures

p one   #=> "RyanOnRails"
p two   #=> ":"
p three #=> " This is a test"

一致するものがない場合は注意が必要です。 String#match はnilを返すので、このようにするとうまくいくかもしれません。

if match = string.match(/(^.*)(:)(.*)/i)
  one, two, three = match.captures
end

とはいえ scan はこのためにほとんど意味をなしません。それはまだ仕事をします、あなたは最初に返された配列を平らにする必要があるだけです。 one, two, three = string.scan(/(^.*)(:)(.*)/i).flatten