質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

3760閲覧

Rubyのmatchメソッドを使って文字をnilが返らず取得するよい方法

miyamiya

総合スコア691

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2016/01/27 12:26

##前提・実現したいこと
Ruby2.2でmatchメソッドを使って特定文字列の抜き出し処理を実装しました。
マッチしなかった場合には、空文字"" が返るようにしています。

処理としては実現できているのですが、ただ、文字を抜き出すのに遠回りなことをしているように思うのです。
簡潔に文字を取得するメソッドや方法は何かないでしょうか。

##改善点・良い方法

Ruby

1"hello john".match(/^hello (.*)/).to_a.last.to_s 2#=> "john"

やっている事と遠回りに思う所は以下です。

  1. matchを使って文字を抜き出す。#文字だけが返ってほしいがnilが返る。
  2. nilが返る可能性があるので、Arrayに変換する。#to_sで文字列として取得したいが、文字だけにならない。capturesはnilが返るため使えなかった。
  3. 文字列を取得するため、最後の要素を取得する。 #Arrayなので要素を取得する必要がある。
  4. nilが返る可能性があるので、文字列に変換する。#ふたたびnilが返る可能性がある。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ブロックで渡すという手が使えるかなと思います。ブロック中身はマッチしたときのみ実行されます。最終的にnilの場合は .to_s|| "" で""にすればいいかと。ついでに、2.3.0から使えるぼっち演算子(&.)の例も載せてみました。

Ruby

1"hello john".match(/^hello (.*)/){|m|m[1]}.to_s 2"hello john".match(/^hello (.*)/){|m|m[1]} || "" 3# 下記は Ruby 2.3.0 から使える &. を使う場合 4"hello john".match(/^hello (.*)/)&.[](1).to_s 5"hello john".match(/^hello (.*)/)&.[](1) || ""

投稿2016/01/27 13:02

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyamiya

2016/01/27 15:02

ブロックの中で指定文字だけを抜き出せるんですね。 ありがとうございます。
guest

0

"#{nil}" => ””となることを利用しては如何でしょう?

irb での実行例

ruby

1$ irb 2irb(main):001:0> s = 'hello john' 3=> "hello john" 4irb(main):002:0> "#{s.match(/^hello (.*)/)}" 5=> "hello john" 6 7irb(main):003:0> s = 'xxxxx' 8=> "xxxxx" 9irb(main):004:0> "#{s.match(/^hello (.*)/)}" 10=> ""

投稿2016/01/27 14:11

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katoy

2016/01/27 14:45 編集

すいません、勘違いしてました。match した時は ""john"" のようにしたかったですね。 ([''] + s.match(/^hello (.*)/).to_a)[-1] では如何でしょう。
otn

2016/01/27 14:18

"hello john"じゃなくて"john"を得たいというのが目的ですよ。
miyamiya

2016/01/27 15:03

文字列の中でnilは解決できそうです。 なるほど、matchで文字列にするとマッチしたものが全てそのまま返って来ちゃうんですね。 これって、返ってきた文字列の使い道は無いように思いますが、挙動がわかりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問