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

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

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

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

Q&A

解決済

2回答

2380閲覧

正規表現について

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

0グッド

0クリップ

投稿2015/05/28 15:33

編集2015/05/29 02:39

以下のソースからhttp://hoge.comという部分だけをRubyの正規表現で抜き出したいです

lang

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

(?<=<a href=").*?(?=">)
わたしは上記のような正規表現を考えたのですがこれだと他の、<a href>以下の部分も引っかかってしまいます

追記
ソースに不備があったので訂正と、その詳細を追記します

lang

1<a href="?p=2">&nbsp;2&nbsp;</a> 2<a href="http://fuga.com/0000.php" rel="bookmark"> 3<a href="http://ランダムな文字列と数列"><img src="http://img.hoge.com/0000.jpeg"

最後の行の"http://hoge.com"を"http://ランダムな文字列と数列"に直しました
私が取り出したいのは"http://ランダムな文字列と数列"の部分です
この部分はランダムとなっており、終端で判別することもできません
しかし、その次にくる文字列はかならず<img src="http://>からはじまるので、ここを使ってなんとか"http://ランダムな文字列と数列"だけを取り出せないか考えています

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

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

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

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

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

guest

回答2

0

ベストアンサー

再びこんにちは。

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

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

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

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

lang

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

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

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

投稿2015/05/29 03:20

編集2015/05/29 03:31
jun68ykt

総合スコア9058

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

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

退会済みユーザー

退会済みユーザー

2015/05/29 03:37

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

2015/05/29 04: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 09:35

お返事遅れてすみません! コメントありがとうございます $1という変数のことを知らなかったので大変参考になりました この度はなんども丁寧に教えていただきありがとうございました 今回の正規表現はMechanizeのなかで使いたかったのですが、そこでも新たな問題にぶつかってしまいました そのため、下記URLで新たに質問をしましたので、大変おこがましいのですがお時間ありましたら回答いただけると幸いです https://teratail.com/questions/10525
guest

0

こんにちは。

まず、考え方として

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

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

regex = /abc/

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

http://hoge.com

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

http://hoge\.com

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

http://hoge.com

とします。これの前後を / で囲んで

lang

1/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

lang

1# coding: utf-8 2 3text = <<EOS 4<a href="?p=2">&nbsp;2&nbsp;</a> 5<a href="http://fuga.com/0000.php" rel="bookmark"> 6<a href="http://hoge.com"><img src="http://img.hoge.com/0000.jpeg"> 7EOS 8 9regex = /http:\/\/hoge\.com/ 10 11text.each_line do |line| 12 if regex =~ line 13 print line 14 end 15end

[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を、以下のようにして取り出せます。

lang

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

以下、これの使用例です。(※ソースコードの色付けが若干おかしくなります。)

[ykt68@sakura-vps] cat question10461-2.rb

lang

1# coding: utf-8 2 3text = <<EOS 4<a href="http://hoge.com/test/a.php">&nbsp;2&nbsp;</a> 5<a href="http://hoge.com/0000.php" rel="bookmark"> 6<a href="http://hoge.com"><img src="http://hoge.com/img/0000.jpeg"> 7EOS 8 9regex = /(href|src)="(http:\/\/hoge\.com[^"]*)"/ 10 11text.each_line do |line| 12 line.scan(regex) do |s| 13 p s 14 end 15end

[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/28 22:29

編集2015/05/29 00:43
jun68ykt

総合スコア9058

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

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

退会済みユーザー

退会済みユーザー

2015/05/29 02:40

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問