てくのろじーたのしー

Haskellぺろぺろ

Rubyで正規表現を使った抽出

rubyって楽で良いですよね。今日もその良さを感じたのでお裾分け。

最初にマッチした部分を取得したいことってよくありますよね。

文字列の中からfooの後に連なった最初の数字を取得したいとします。冗長に書くとこんな感じですかね?

if match = "foo123bar456".match(/foo(\d+)/)
  digit = match[1]
end

String#matchを使ってもString#=~を使ってもどっちみち$1などは作られるのでさっさと=~と$1を使ったコードにしましょう。マッチを行う場所とマッチした部分を使う場所が遠いでもない限りあまり問題にはならないことが多いでしょう。でも良い子のみんなは時と場合を選びましょう。

if "foo123bar456" =~ /foo(\d+)/
  digit = $1
end

こんなコード書こうものなら熟練rubyistからのマサカリが飛んできそうです。すばやく後置ifに書き換えます。

digit = $1 if "foo123bar456" =~ /foo(\d+)/

これでifの外からでもdigitが使えますね。これで熟練rubyistもニッコリです。

 

 

 

 

 

いやいや、コードを左から読んでいると真っ先に$1という部分が来て見た目がなんかアレです。

digit = "foo123bar456" =~ /foo(\d+)/ && $1

はい。みんな大好き&&さんです。後置ifとどちらを使うかは時と場合を選んでください(二度目)。ruby使い以外からしたらトリッキーなコードですね。

 

え?マッチしなかった時はどうする?一行でif-then-end書いた方がマシ?

みんな違ってみんな良いということですね!!!

寒いノリでくだらないネタ書いたことを反省している。夜のテンション怖い。