正規表現 Part9

このエントリーをはてなブックマークに追加
952その@:2012/06/20(水) 18:31:30.82
正規表現について質問です。

↓こーいう文字列に対してC#で正規表現を掛けようと思っています。(実際には改行コードは含まれていません。)

<li class="g"><div class="vsc" sig="jNt" bved="0CDUQkQo" pved="0CDQQkgowBQ">
<h3 class="r"><a class="l" onmousedown="return rwt(this,'','','','6',
'AFQjCNE3acQNFxBDQ4S2wYC0wVeDKQSSjQ','',
'0CKUBEBYwBQ',null,event)" href="http://www.jpa.or.jp/chishiki/index.html"><em>たまご</em>
の知識</a></h3><div class="vspib" role="button" tabIndex="0" aria-label="結果の詳細">
<div class="vspii"><div class="vspiic"></div></div></div><div class="s">
<div class="f kv"><cite>www.jpa.or.jp/chishiki/index.html</cite><span class="gl">
953そのA:2012/06/20(水) 18:32:05.39
- <a onmousedown="return rwt(this,'','','','6','AFQjCNFdsuuoe_u5WYesXSqMlVLQ9T5KuA','','0CDcQIDAF',null,event)" href="http://webcache.googleusercontent.com/search?q=cache:wVOdEgj0slAJ:www.jpa.or.
jp/chishiki/index.html+&cd=6&hl=ja&ct=clnk&gl=jp">キャッシュ
</a></span><span class="vshid"><a href="/search?hl=ja&q=related:www.jpa.or.jp/
chishiki/index.html+%E5%8D%B5&tbo=1&sa=X&ei=sZXhT6-XJobjmAWxq53xAw&ved=0CDgQHzAF">
類似ページ</a></span></div><div style="display: none;" id="poS5" class="esc slp">一般公開で +1 しました 
<a class="fl" href="#">取り消す</a></div><span class="st"><em>
卵</em>は私たちの食生活に欠かすことのできないほど身近なものです。それだけに、
「実は知らなかった!」ということも多いのではないでしょうか? このページでは、
<em>卵</em>についてのいろいろな知識を紹介しています。
興味をもった項目をクリックして、<em>卵</em>への理解を <b>...</b>
<br></span></div></div></li>


※メッセージが長すぎます、と怒られちゃうので分割して投稿しています。
954そのB:2012/06/20(水) 18:34:34.61
そして、     http://www.jpa.or.jp/chishiki/index.html    というURLを抜き出す為に


// string wk = ごにょごにょした上記のHTMLが含まれています。

System.Text.RegularExpressions.MatchCollection mc2 =
System.Text.RegularExpressions.Regex.Matches(wk, @".*,null,event\)"" href=""(?<url>[A-Za-z0-9_\.\/].*?)""><em>.*");

foreach (System.Text.RegularExpressions.Match m2 in mc2)
{
string s = m2.Groups["url"].Value;

}

というコードを実行すると …続く
955そのC:2012/06/20(水) 18:37:11.79
↓の部分で正規表現でヒットしちゃいます。
foreach ループの中で

1回目(欲しい部分)
2回目(不要な↓のデータ)    ・・・  (A)

とループ処理の中で流れれば良いのですが、 m2.Groups["url"].Value; ループは1回のみ通り
(A) が取得されてしまい困ってます。私の正規表現はどこかおかしいでしょうか?

http://webcache.googleusercontent.com/search?q=cache:wVOdEgj0slAJ:www.jpa.or.jp/chishiki/index.html+&cd=6&hl=ja&ct=clnk&gl=jp">
キャッシュ</a></span><span class="vshid"><a href="/search?hl=ja&q=related:www.jpa.or.jp/chishiki/index.html+%E5%8D%B5&tbo=1&sa=X&
ei=sZXhT6-XJobjmAWxq53xAw&ved=0CDgQHzAF">類似ページ</a></span></div><div style="display: none;" id="poS5" class="esc slp">
一般公開で +1 しました <a class="fl" href="#">取り消す</a></div><span class="st
956デフォルトの名無しさん:2012/06/20(水) 18:37:29.01
ちょwww
957デフォルトの名無しさん:2012/06/20(水) 18:50:38.34
もうちょっと整理しろよ
長々と書くならコピペだけで動くコードにして、コード貼るサイトに書いてくれ。
958デフォルトの名無しさん:2012/06/20(水) 18:55:32.97
結局、
null,event)" href="[URL]"><em>
の[URL]部分だけ取り出したいのに、うまくいかないということか?
959デフォルトの名無しさん:2012/06/20(水) 19:00:23.64
ざっと見た感じ
(?<url>[A-Za-z0-9_\.\/].*?)
の後ろのピリオドが邪魔じゃね?
パラメータいらないなら、:だけ追加して
(?<url>[A-Za-z0-9_\.\/:]*?)
こうとか?
960デフォルトの名無しさん:2012/06/20(水) 19:39:37.57
>>957
コードを貼って見せられるサイトとかあればいんですけどね。
自前のサーバにアップしかないか。

>>958
はい、同じ様なURLが複数HTML存在しており、
URL部分だけを抽出したいのに余計なところが
抽出されてしまっています。
つまり。 >>952 >>953 のうち抽出したいURLは、http://www.jpa.or.jp/chishiki/index.html だけなんです。
しかし、現状の正規表現では >>955 の下段に記載した余計なHTMLが抽出されてしまっています。

>>959
やってみますです。
961デフォルトの名無しさん:2012/06/20(水) 19:53:51.26
>>960
http://pastebin.com/

どこまでマッチさせたいのかよく分からないけど、
href="〜" ならば、意味合い的にコアの部分は href=""(?<url>[^""]*)""
とかで十分では。
962デフォルトの名無しさん:2012/06/20(水) 20:10:12.39
>>960
コード貼るサイトあるんだよ。
質問スレのテンプレ探してみ。
963デフォルトの名無しさん:2012/06/20(水) 20:11:25.52
>>961
ありがとうございます。 "" を含まないという意味ですよね。
System.Text.RegularExpressions.Regex.Matches(wk, @".*,null,event\)"" href=""(?<url>[^""]*)""><em>.*");
でやってみたところそれらしいそれらしい値は取れる様になりました。

ただ、ごにょごにょしたHTMLが10件ほどあって
そのうちの7つはしっかり抽出出来るのですが
それ以外が未だうまくいかないのでもうちょっと頑張ってみます。

964963:2012/06/20(水) 20:32:55.97
>>962
ありがとうございます。便利なサイトがあるものですね。


↓の正規表現を書いていたのですが、
System.Text.RegularExpressions.Regex.Matches(wk, @".*,null,event\)"" href=""(?<url>[^""]*)""><em>.*");

この正規表現の場合、(A)の場合は取得出来るのですが、
(B)の場合に取得が出来ません。(B)の場合でも取得出来るにはどういう条件を追加すれば良いでしょうか?

(A) BYwBw',null,event)" href="http://www.nichirankyo1.or.jp/"><em>卵1</em>
(B) BYwBw',null,event)" href="http://www.nichirankyo2.or.jp/">日本<em>卵2</em>
965デフォルトの名無しさん:2012/06/20(水) 21:10:19.55
System.Text.RegularExpressions.Regex.Matches(wk, @".*,null,event\)"" href=""(?<url>[^""]*)"">[^<]*<em>");

マッチさせたい範囲を明確にして欲しいな。特に、後ろの<em>以降もマッチさせる必要あるのかどうか。
こんなのでも確定出来るんじゃないの?
System.Text.RegularExpressions.Regex.Matches(wk, @",null,event\)"" href=""(?<url>[^""]*)");

あと、スペース入る可能性あるところ全部に\s*を入れるのがセオリー。
966デフォルトの名無しさん:2012/06/20(水) 21:19:32.12
>>965
ありがとうございます。出来ました!!!セオリーもありがとうございます。

[^<]* の解釈としては、

< 以外 の文字列が 0 回以上存在する

で良いでしょうか?
967デフォルトの名無しさん:2012/06/20(水) 21:21:06.17
因みに

http://gimite.net/help/devas-ja/all_regex.html

のサイトよく纏められていておすすめです。
968デフォルトの名無しさん:2012/06/20(水) 21:31:43.10
>>966
そうです。>>961の[^""]*も同様。
マッチを明確にすることが出来るので、常套手段です。
これでうまくいかないときだけ.*?を使います。

くどいようですが、まず最初に「確実に確定できるマッチ範囲」をしっかり決めた方が吉です。
969デフォルトの名無しさん:2012/06/20(水) 21:43:39.52
ありがとうございます。修行します。
970デフォルトの名無しさん:2012/06/20(水) 21:52:46.74
返されるデータを正規表現だけで全て抽出しようと試みてましたが
結構厳しそうです。


あらゆるパターンがあるので。

地道に文字列操作します。
971デフォルトの名無しさん:2012/06/20(水) 22:23:01.21
【6月19日 AFP】大韓航空は18日、ケニアの人々が「原始的エネルギー」で満ちていると広告で表現したことを謝罪し、
ウェブサイトから広告を削除した。

 ソウル・ナイロビ間の便を近日就航する予定の大韓航空は、そのPR広告で「大韓航空で飛び、アフリカの大いなるサバンナ、
サファリツアー、そして原始的エネルギーに満ちた先住民たちを楽しみましょう」と表現した。

 あるケニア人はこうツイートしている。
 「私の #原始的エネルギーを処理するために今日はライオン狩りとゾウいじめをしようと思う」

 別のケニア人はこうツイートした。
 「私は毎朝起床するために #原始的エネルギー を使っています」

 数百件のツイートが集まったことを受け、大韓航空は、「ナイロビ便の最近の広告についてしかるべき確認を行っています。
この状況に対して心から謝罪いたします」と発表した。

以下省略
http://www.afpbb.com/article/economy/2885046/9141540
972uy:2012/06/22(金) 14:33:13.43
進化しないよね、正規表現
機能が足り無すぎ
973デフォルトの名無しさん:2012/06/22(金) 14:39:10.52
(?R) とかあるじゃん。
974デフォルトの名無しさん:2012/06/22(金) 15:05:56.77
>>972
^
$
(|)
[]
n
\

これで十分です
975uy:2012/06/22(金) 17:29:25.46
そう思うなら君はそこで永久に成長止まれば良いわけで

正規表現って何年前に作られたもので何年間ろくに成長せずに止まってるんだよっていう
正規表現内にシンタックスシュガー入れないからいつまでたっても正規表現は見にくい
人間が書ける範囲を狭める
976デフォルトの名無しさん:2012/06/22(金) 17:50:07.85
>>975
そう思うなら君が新たなる次世代型正規表現とやらを作ったらいかがかね?
977デフォルトの名無しさん:2012/06/22(金) 17:50:32.52
>>972-975
さすがにこれは「お前らがそう思うんなら(ry」としか言いようがない
こちとらPerlとかRubyの最新版のマニュアル見てたら
\gだの\kだの\pだの今まで知らなかった拡張記法があって脳汁が溢れそうなんだがw

俺はuyのように全てを知り尽くしたわけじゃないから、
今後もこういった発見で楽しい思いをさせてもらうよ
978デフォルトの名無しさん:2012/06/22(金) 18:28:04.49
>>975
シンタックスシュガーがほしいだけなの?
シンタックスシュガーがあれば人間がかける範囲が広がると思うのはちょっとどうかと
979デフォルトの名無しさん:2012/06/22(金) 18:28:35.50
正規表現はマスターすれば
バリデーションチェックとか速そうですね。


正規表現を考える時間に
文字列操作でバリデーションを作成した方が早かったりするので悩みますねん。
980デフォルトの名無しさん:2012/06/22(金) 18:31:13.81
時間あるときに考えて、作って、速度比較してみたらいいよ。
たぶん今作ってるほうが速いよ
981デフォルトの名無しさん:2012/06/22(金) 18:46:57.01
使えない人ってなぜか使わなくてよい理由を探して口にださないと済まないみたいだ。
982デフォルトの名無しさん:2012/06/22(金) 19:09:34.29
ちょっと複雑になると途端に見にくくなるとか、プログラム側で分岐させるだけでスッキリする場合とか、
確かにそういうところがあるのは否定出来ない。

そういえば否定もちょっとめんどい。
983デフォルトの名無しさん:2012/06/22(金) 19:10:24.04
>>981
でもある言語の同じレベルのプログラマ達の中で、使える人と使えない人が
くっきり分かれてしまうのは問題だと思いませんか。
984デフォルトの名無しさん:2012/06/22(金) 19:20:32.46
>>980
物にもよるかと思いますが
プログラムでロジックを組んだ方が開発時間が短縮出来る気がしてます。
985デフォルトの名無しさん:2012/06/22(金) 19:47:48.43
確かに誰でも使いやすい道具になるのは正しいこと。
俺だって昔はなんだこりゃと思った時期もあったし、
それを忘れてこんなの出来ないのかよと言うのはただの傲慢かと思う。

でも、そんなに難しくないから理解すると楽できるとこがありますよ。

>>982
否定は誰かが構文作ってくれるに違いない。あれは人がやる仕事じゃない。
986uy:2012/06/22(金) 20:05:54.52
>>978
そこからか?
アセンブラで作れる範囲のプログラムと
C#で作れる範囲のプログラム
理論上は作れるとかいうボケいらないよ?
987uy:2012/06/22(金) 21:59:25.71

str = "12345678"
str.scan(/\d{1,3}/) {|m| p m }

"123" "456" "78"
と表示されるけどこれを
"12" "345" "678"
にしたんだけどどうやんの??
988デフォルトの名無しさん:2012/06/22(金) 22:13:33.43
>>984
うん、ものによるのは確かにそうで、ある程度複雑になった場合は、
正規表現のほうが明快かつ速度も優れる場合があると思う。
逆に、ある程度単純な場合は正規表現を使わないほうが速いことが多い。

>>981
使うな厨だといいたいのかな。

>>986
C#がアセンブラのシンタックスシュガーであるという大ボケを見せてくれてるの?
989uy:2012/06/22(金) 22:20:46.61
>C#がアセンブラのシンタックスシュガーであるという大ボケを見せてくれてるの?

おい

アセンブラで3Dゲー作れ
990デフォルトの名無しさん:2012/06/22(金) 22:26:35.29
>>989
その前に答えてよ。
C#ってアセンブラのシンタックスシュガーなの?
991uy:2012/06/22(金) 23:21:59.97


>>990


なんだ



ただのバカか




992デフォルトの名無しさん:2012/06/22(金) 23:41:10.23
(?:.*\n{2}).*
の書き込みをする人にイラッ☆
993デフォルトの名無しさん:2012/06/22(金) 23:46:47.51
>>987
reverseしておいてそれやって、reverse
994デフォルトの名無しさん:2012/06/23(土) 00:19:27.72
>>991
恥ずかしくなったの?改行多いよ
995デフォルトの名無しさん:2012/06/23(土) 00:25:43.93
ふつう、言語そのものを、低水準言語のシンタックスシュガーとは言わないような。
996デフォルトの名無しさん:2012/06/23(土) 01:00:58.28
でかい釣り針だな…
とりあえずおまいら全員Perl6の正規表現を読んで失禁してくればいいと思うよ
http://feather.perl6.nl/syn/S05.html
997デフォルトの名無しさん:2012/06/23(土) 01:15:14.82
ラクダ本4版の正規表現の章は100ページ近くあって軽くひきつけを起こした
998uy ◆pdu1UZmweE :2012/06/23(土) 01:33:43.00
>>994

なんだ


ただの
ゴミか
999uy ◆pdu1UZmweE :2012/06/23(土) 01:34:46.66
>>994

なんだコイツ

ゴミじゃねーか
1000uy ◆pdu1UZmweE :2012/06/23(土) 01:35:27.46
 
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。