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

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

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

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

Q&A

解決済

5回答

459閲覧

[Ruby].で区切られた文字列(サブドメイン)をトップレベルまでリスト化したい

masarusan24

総合スコア55

Ruby

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

1グッド

1クリップ

投稿2020/05/13 08:24

編集2020/05/13 09:01

やりたいこと

"hoge.fuga.piyo.com"のような.で区切られた文字列(サブドメイン)に対して、上位レベルのドメインのリストを取り出したい。

イメージとしてはこのような感じです。

Ruby

1sub_domain = "hoge.fuga.piyo.com" 2list_of_domains(sub_domain) 3=> ["hoge.fuga.piyo.com", "fuga.piyo.com", "piyo.com"]

試したこと

Ruby

1def upper_level_domain(domain) 2 return domain.split(".")[1..-1].join(".") if domain.split(".").size > 2 3 domain 4end

1つ上位のドメインを取り出すためのメソッドを実装したものの、これをうまいこと再帰的に呼び出してリスト化する方法が思い付かず、お知恵をいただけると助かります。
よろしくお願いいたします。

環境

Ruby 2.6.0

追記

これでイケるかもしれないです。

def list_of_domains(domain) list = [] (domain.split(".").length - 1).times do |i| list << domain.split(".", i+1).last end  list end

ですが、何か泥臭い感じがしますので、もう少しエレガントな方法をご存知であればご教示いただけると大変ありがたいです。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答5

0

質問の内容に沿うよう素朴に再帰を用いて書いてみた場合、次のようなコードになるかもしれません

ruby

1def list_of_domains(domain_name, ret = []) 2 ret << domain_name if ret.size.zero? 3 processing_string = domain_name.split('.').then { |x| x[1..-1].join('.') } 4 5 return ret unless processing_string.include?('.') 6 7 list_of_domains(processing_string, ret << processing_string) 8end 9 10sub_domain = "hoge.fuga.piyo.com" 11pp list_of_domains(sub_domain) 12# => ["hoge.fuga.piyo.com", "fuga.piyo.com", "piyo.com"]

なにか参考になれば幸いです

投稿2020/05/13 11:29

gouf

総合スコア2321

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

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

0

ベストアンサー

解1

def list_of_domains(domain) list = [] while domain =~ /./ do list << domain; domain = domain.sub(/^[^.]+./,"") end list end

解2

def list_of_domains(domain) (dom=domain.split('.')).inject([domain]){|ary,_d| dom.shift;ary<<dom.join(".")} end

投稿2020/05/13 09:53

編集2020/05/13 10:00
winterboum

総合スコア23324

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

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

0

upper_level_domain は未使用ですが、これでどうでしょう?

ruby

1def list_of_domains(domain) 2 if domain.include?('.') 3 [domain, *list_of_domains(domain.split('.', 2)[1])] 4 else 5 [] 6 end 7end

投稿2020/05/13 09:04

taichi730

総合スコア318

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

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

0

皆さまご回答ありがとうございました。
色々な書き方があり、とても勉強になりました。
どれも参考にさせていただきつつ、ベストアンサーを選択しましたのでクローズとします。
ありがとうございました。

投稿2020/05/14 09:10

masarusan24

総合スコア55

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

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

0

冗長かもしれませんが、以下でどうでしょう?

sub_domain = "hoge.fuga.piyo.com" def upper_level_domain(domain) b=[] a=domain.split(".").size-2 for i in 0..a b << domain.split(".")[i..-1].join(".") end return b end p upper_level_domain(sub_domain)

出力
["hoge.fuga.piyo.com", "fuga.piyo.com", "piyo.com"]

投稿2020/05/13 09:09

DrqYuto

総合スコア432

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

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

DrqYuto

2020/05/13 09:12

timesで書き直しました。 ``` sub_domain = "hoge.fuga.piyo.com" def upper_level_domain(domain) b=[] a=domain.split(".").size-2 a.times{|i| b << domain.split(".")[i..-1].join(".") } return b end p upper_level_domain(sub_domain) ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問