こんにちは。
まず、考え方として
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"> 2 </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"> 2 </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/29 03:37
2015/05/29 04:37
退会済みユーザー
2015/05/30 09:35