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

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

ただいまの
回答率

90.62%

  • Ruby

    7297questions

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

正規表現について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 847
退会済みユーザー

退会済みユーザー

以下のソースからhttp://hoge.comという部分だけをRubyの正規表現で抜き出したいです
<a href="?p=2">&nbsp;2&nbsp;</a>
<a href="http://fuga.com/0000.php" rel="bookmark">
<a href="http://hoge.com"><img src="http://img.hoge.com/0000.jpeg">
(?<=<a href=").*?(?=">)
わたしは上記のような正規表現を考えたのですがこれだと他の、<a href>以下の部分も引っかかってしまいます

追記
ソースに不備があったので訂正と、その詳細を追記します
<a href="?p=2">&nbsp;2&nbsp;</a>
<a href="http://fuga.com/0000.php" rel="bookmark">
<a href="http://ランダムな文字列と数列"><img src="http://img.hoge.com/0000.jpeg"
最後の行の"http://hoge.com"を"http://ランダムな文字列と数列"に直しました
私が取り出したいのは"http://ランダムな文字列と数列"の部分です
この部分はランダムとなっており、終端で判別することもできません
しかし、その次にくる文字列はかならず<img src="http://>からはじまるので、ここを使ってなんとか"http://ランダムな文字列と数列"だけを取り出せないか考えています

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

再びこんにちは。

追記に対しての回答になります。

<a href="http://ランダムな文字列と数列"><img src="http://img.hoge.com/0000.jpeg"

の「ランダムな文字列と数列」という意図は、つまり「任意のURL」ということでよいでしょうか?
以下、その前提での回答になります。

取り出したいURLをhref属性として持っている<a>は、そのすぐ後に
<img src
が続くというのが条件ならば、マッチする正規表現としては
regex = /<a href="([^"]+)"><img src/

あたりでいかがでしょうか?(すみませんが、テストコードを書いての検証は
しておりません。)これだと、マッチしたときに
$1
に欲しいURLが入ってきます。
ただ、
・a とhrefとの間は、半角スペース1個とは限らない。
とか
・imgとsrcとの間は、半角スペース1個とは限らない。
・<a>のタグを閉じる側の不等号(>)と、<img>のタグを開く側の不等号(<)との間には
 任意の個数の半角スペースやタブがあるかもしれない。
といった他の諸条件も考えなければいけませんが、そういった拡張も
上記の正規表現を修正していけば対応できるのではないかと思います。

ご参考になれば幸いです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/29 12:37

    こんにちは
    早速回答していただきありがとうございます
    「ランダムな文字列と数列」は、「任意のURL」という解釈であってます
    教えていただいた正規表現を試したところ、
    <a href="http://ランダムな文字列と数列"><img src
    がマッチしてしまいました...!

    キャンセル

  • 2015/05/29 13:37

    さっそく試して頂いたとのことで、ありがとうございます。

    > <a href="http://ランダムな文字列と数列"><img src
    > がマッチしてしまいました...!

    はい。それで正しいです。
    regex = /<a href="([^"]+)"><img src/
    という正規表現にマッチするのは
    <a href="http://ランダムな文字列と数列"><img src
    の部分です。
    マッチした場合に、"http://ランダムな文字列と数列"の部分は

    $1

    という変数に入っているはずです。
    試しに、以下のコード
    ーーーー
    # coding: utf-8

    target = '<a href="http://ランダムな文字列と数列"><img src="http://img.hoge.com/0000.jpeg"'

    regex = /<a href="([^"]+)"><img src/

    if ( regex === target )
    puts $1
    end
    ーーーー
    をコピペしてrubyのソースを作成して実行してみてください。

    http://ランダムな文字列と数列

    と表示されるはずです。





    キャンセル

  • 2015/05/30 18:35

    お返事遅れてすみません!
    コメントありがとうございます
    $1という変数のことを知らなかったので大変参考になりました
    この度はなんども丁寧に教えていただきありがとうございました

    今回の正規表現はMechanizeのなかで使いたかったのですが、そこでも新たな問題にぶつかってしまいました
    そのため、下記URLで新たに質問をしましたので、大変おこがましいのですがお時間ありましたら回答いただけると幸いです
    https://teratail.com/questions/10525

    キャンセル

0

こんにちは。

まず、考え方として

abcにマッチする正規表現は、単にそのまま abc

です。rubyで正規表現 abc を使うときには、 / で前後を囲んで

regex = /abc/

としますが、この例で正規表現と呼ばれるものが該当する部分は、
上記の/ と / で囲まれた中にある、 abc です。
これと同じで、「http://hoge.comにマッチする正規表現」を作るときは、
まずは、そのまま

http://hoge.com

から始めます。このまま何も手を加えずに使えたら楽なのですが、
半角ドットは、ここままだと「任意の一文字」を表してしまうので
エスケープする必要があり、

http://hoge\.com

とします。
さらに、ruby のプログラムで正規表現を / で囲むことで作るときは、
正規表現の中に現れる、スラッシュという文字そのものにマッチさせたい
という意図で書く、/ もエスケープする必要があるので

http:\/\/hoge\.com

とします。これの前後を / で囲んで
/http:\/\/hoge\.com/
とすれば、rubyのプログラムの中で使えるようになります。
以下、使用例です。

[ykt68@sakura-vps] ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
[ykt68@sakura-vps] cat question10461.rb
# coding: utf-8

text = <<EOS
<a href="?p=2">&nbsp;2&nbsp;</a>
<a href="http://fuga.com/0000.php" rel="bookmark">
<a href="http://hoge.com"><img src="http://img.hoge.com/0000.jpeg">
EOS

regex = /http:\/\/hoge\.com/

text.each_line do |line|
  if regex  =~ line
    print line
  end
end
[ykt68@sakura-vps] ruby question10461.rb
<a href="http://hoge.com"><img src="http://img.hoge.com/0000.jpeg">
[ykt68@sakura-vps]

上記の例では、読み込むテキストの各行に、
http://hoge.com

が1つ以上あれば、その行を出力します。
注意点としてはこの正規表現では

http://hoge.com/test/a.php



http://hoge.comic.jp

といったものを含む行もマッチする点です。しかし、これらもマッチする
正規表現であっても問題がない状況も考えられます。たとえば

入力されるテキストに出てくるURLのドメインが
hoge.comである場合、そのURLは
http://hoge.com に限られる。

という前提があり、それを知っていたとするならば、
http://hoge.com を取り出すのに、
正規表現 http:\/\/hoge\.com で十分事足りる
ことになります。
つまり、入力されるテキストについてどれだけのことを知っているかに
よって、書くべき正規表現の複雑さが変わってくるということです。

応用として、

入力されたHTMLに含まれる、<a>要素のhref属性または<img>要素のsrc属性の値
として出現する、http://hoge.com で始まるURLをすべて抜き出す。その際に、
それがhrefの値なのか、srcの値なのか分かるようにする。

という要件があったとします。
その際は、たとえば正規表現regexを、以下のようにして取り出せます。
regex = /(href|src)="(http:\/\/hoge\.com[^"]*)"/
以下、これの使用例です。(※ソースコードの色付けが若干おかしくなります。)

[ykt68@sakura-vps] cat question10461-2.rb
# coding: utf-8

text = <<EOS
<a href="http://hoge.com/test/a.php">&nbsp;2&nbsp;</a>
<a href="http://hoge.com/0000.php" rel="bookmark">
<a href="http://hoge.com"><img src="http://hoge.com/img/0000.jpeg">
EOS

regex = /(href|src)="(http:\/\/hoge\.com[^"]*)"/

text.each_line do |line|
  line.scan(regex) do |s|
    p s
  end
end
[ykt68@sakura-vps] ruby question10461-2.rb
["href", "http://hoge.com/test/a.php"]
["href", "http://hoge.com/0000.php"]
["href", "http://hoge.com"]
["src", "http://hoge.com/img/0000.jpeg"]
[ykt68@sakura-vps] 


ただし、
  • 属性名(srcやhref)とその値の間に、空白文字があるかもしれなかったり、
  • 属性の値を囲むクオートがダブルクオートだけではなくシングルクオートもあるかもしれなかったり
  • srcやhrefが大文字で、SRCやHREFとなっていることもあったり、なかったり
すると、これらに対応するために正規表現にも追加が必要になってきて、
これもまた、先に述べた

入力されるテキストについてどれだけのことを知っているかに
よって、書くべき正規表現の複雑さが変わってくる

ことの例です。

以上、ご参考になりましたら幸いです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/05/29 11:40

    回答ありがとうございます
    こんなに親切に教えていただき、大変参考になりました
    ただ私の説明不足で、教えていただいた正規表現では、いま悩んでる問題は解決できませんでした
    丁寧に教えてくださったのに申し訳ありません
    そのため、詳細を追記しましたのでよろしければもう一度教えていただけないでしょうか
    よろしくお願いします

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • Ruby

    7297questions

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