Perl v5.8.5 の正規表現なんじゃけど、例えば、
<div class="hoge1"><div class="hoge2">ほげほげ</div><div class="hoge3"></div></div>わたしは恥知らずな夜のホームラン王よ!<div class="date">[ 8/6 12:48 ]</div>
みたいなテキスト(HTML ソース)があったとして、
/\/div>(.*?)<div class=\"date\">\[(.*?)\]/gs
みたいなマッチング条件だと、
$1に
<div class="hoge3"></div></div>わたしは恥知らずな夜のホームラン王よ!
がセットされてしまう。最短マッチの(.*?)っていう条件にしてるのに、最長マッチしたものがセットされているってわけだ。
で、
/.+\/div>(.*?)<div class=\"date\">\[(.*?)\]/gs
みたいに、頭に .+ という「任意の数文字」という条件を足すと、ちゃんと
わたしは恥知らずな夜のホームラン王よ!
だけを取ってくる。
何、これ?
正規表現の神よ、なんで .+ を付けるだけで結果が変わってくるのん?.*?って最短マッチしてるんだから、その前に任意の文字があろうがなかろうが関係ないやん。
なんでぇ?教えてぇ?
始めまして。興味を持てるブログでしたので書かせていただきます。
.*?、または.* (.+) をいれた後の条件(本件では\/div>)を最短でマッチさせるか、最長でマッチさせるかになりますので.+を\/div>の前につけることで最長マッチで目的の文字の前までをマッチしますので、今回の目的を満たされます。
尚、例題の文字列が繰り返されないのであれば正規表現のカッコの中の.*?は.*としても同じ結果を取り出せると思うのですがいかがでしょうか。
下手な文章で分かり辛かったらごめんなさい。それでは。
marknさん、ご教示ありがとうございます。
ああ・・・なるほど・・・
/\/div>(.*?)<div class=\"date\">\[(.*?)\]/gs
だと、まず、
<div class="hoge1">
<div class="hoge2">
ほげほげ
</div>
までが最短でマッチして、なので、その後の最短マッチは、
<div class="hoge3"></div>
</div>わたしは恥知らずな夜のホームラン王よ!
となる・・・ということですね。
.+ を付けてやることで最長マッチになる・・・というのを知りませんでした。
.+ を付けなくても(基本的に何も指定していなければ)最長マッチになるのだと思っていたのですが、違うんですね・・・(^^;そこが誤解の根でした(^^;
^ で先頭指定をしているわけではないので、明示的に .+ を付けなくても、.+(というか .* )が設定されているものとして処理されるものだと、今の今まで思っておりました(^^;;;
あと、確かに '/dev>' までが最長マッチでくるのなら、.*? と最短マッチにする必要はありませんね。(<div class=\"date\"> は複数出てこない HTML ファイルなので)
ありがとうございます。すっきりしました。
コメント拝見しました。お役に立てたようで良かったです。
.*(0文字以上の何かしらの文字) と .+ (1文字以上の...) は微妙に違うようで、場合によっては致命的な違いになりますのでご留意いただければと思います。
私もperlを使ってますが、私では普段扱わない分野についての記事があり書かれていて勉強になります。
また、perl以外の記事も興味深いものがあり、一読者として楽しませてもらってますのでこれからもよろしくお願いいたします。