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

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

ただいまの
回答率

90.22%

【Ruby/正規表現】指定文字から指定文字までの間を抽出したい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 172

pecchan

score 267

Rubyも正規表現も初めてで行き詰っております。

以下のような文章があります。

aaaaabbbbbbccccddddd;https://www.youtube.com;hoehogehoge_embedded xxxx,yyyy,zzzz

この中から、
「https://www.youtube.com」~「_embedded」
までの
「https://www.youtube.com;hoehogehoge;_embedded」
を取得したいです。

以下のようにしたのですが、

str.match(/.*_embedded;/)


前全部が取得されてしまいましたorz

aaaaabbbbbbccccddddd;https://www.youtube.com;hoehogehoge;_embedded

正しい記述を教えて下さい。
宜しくお願い致します。

【同日追記】
「https://www.youtube.com」~「_embedded」の前後は、実際には特に決まった形式はなく、
日本語の文章などが入ります。

【例文】
以下のような感じです。

お早う。https://www.yahoo.co.jp こんにちは。<br> https://www.youtube.com;aaaxxxxxxxxhohhohohooho_embedded hhh xxxxYYY https://www.google.com/ dddd テストテスト。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

rubyは良く知りませんが、下のコードで出来てる気がします。

a ="お早う。https://www.yahoo.co.jp こんにちは。<br> https://www.youtube.com;aaaxxxxxxxxhohhohohooho;test;xxxxYYY h\
ttps://www.google.com/ dddd テストテスト。"

b = a.match(/https:.*?;/)
puts b[0]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/07 15:50

    有難う御座います。
    結果は以下のように、なりました^^;
    https://www.yahoo.co.jp こんにちは。<br> https://www.youtube.com;

    キャンセル

  • 2019/07/07 15:54

    ちょっと質問を勘違いしていました。
    これですが、最初のhttpは拾いたくないということですか。つまり、捨てるべき文字列の中にもhttp~が含まれうるということでしょうか。だとすれば、すこし拾うべき文字列のパターンを考え直す必要があるように思います。

    キャンセル

  • 2019/07/07 15:56

    度々申し訳ございません。
    さようです。途中に出てくるhttpは拾いたくなく、youtubeと付くものだけ拾いたいのです。
    ※youtubeと付くものは必ず1つになります。

    キャンセル

checkベストアンサー

+1

str.match(/https:\/\/www\.youtube\.com.*?_embedded/)
ではどうでしょうか。

str = 'aaaaabbbbbbccccddddd;https://www.youtube.com;hoehogehoge_embedded xxxx,yyyy,zzzz'
result =  str.match(/https:\/\/www\.youtube\.com.*?_embedded/)
puts result


実行結果
https://www.youtube.com;hoehogehoge_embedded

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/07 17:39

    有難う御座います。

    おかげで取得できました。

    正規表現、難しいです。

    キャンセル

  • 2019/07/08 00:42

    URIを含む正規表現の場合は
    %r{https://}的な感じにすると/をエスケープする必要がなくなり
    {}はURIには存在しない文字なのでちょっと楽です。

    キャンセル

  • 2019/07/09 11:40

    有難う御座います。

    キャンセル

+1

その場で書いたコードですが、

text = 'aaaaabbbbbbccccddddd;https://www.youtube.com;hoehogehoge;test;xxxx,yyyy,zzzz'
array = text.split(";", 2)
array[1]


として、最初の;が出てきたら分割し、その後のものをとるのはどうでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/07 16:22

    質問ですが、要はyoutubeに関連したURLを取得したいということでしょうか?

    どちらにしても、先ほど渡したURLを少し弄れば取得できるのですが...汗

    キャンセル

  • 2019/07/07 16:35

    array = text.scan(/https:\/\/www\.youtube(?<=https:\/\/www\.youtube)[^\\\&]+/)
    とりあえず、youtubeのURLだけで良さそうなので、ややこしいですがこれでいけました

    キャンセル

  • 2019/07/07 17:39

    度々申し訳ございません。

    有難う御座いました。

    キャンセル

0

a.rb

strs = [
  'aaaaabbbbbbccccddddd;https://www.youtube.com;hoehogehoge_embedded xxxx,yyyy,zzzz',
  'お早う。https://www.yahoo.co.jp こんにちは。<br> https://www.youtube.com;aaaxxxxxxxxhohhohohooho_embedded hhh xxxxYYY https://www.google.com/ dddd テストテスト。',
  'xxx'
]

z = strs.map do |x|
  m = x.match(/.*(https:\/\/www\.youtube\.com;.*?_embedded) .*/)
  m[1] if m
end.compact
p z

実行例
イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる