正規表現の最短マッチがようわからんようなったがな(2012-08-07 19:03:51)へのコメント


by markn(2012-08-09 15:07:47)

始めまして。興味を持てるブログでしたので書かせていただきます。

.*?、または.* (.+) をいれた後の条件(本件では\/div>)を最短でマッチさせるか、最長でマッチさせるかになりますので.+を\/div>の前につけることで最長マッチで目的の文字の前までをマッチしますので、今回の目的を満たされます。
尚、例題の文字列が繰り返されないのであれば正規表現のカッコの中の.*?は.*としても同じ結果を取り出せると思うのですがいかがでしょうか。
下手な文章で分かり辛かったらごめんなさい。それでは。


by shinoda(2012-08-09 18:41:08)

marknさん、ご教示ありがとうございます。

ああ・・・なるほど・・・

/\/div>(.*?)<div class=\"date\">\[(.*?)\]/gs
だと、まず、

<div class="hoge1">
<div class="hoge2">
ほげほげ
</div>

までが最短でマッチして、なので、その後の最短マッチは、

<div class="hoge3"></div>
</div>わたしは恥知らずな夜のホームラン王よ!

となる・・・ということですね。
.+ を付けてやることで最長マッチになる・・・というのを知りませんでした。
.+ を付けなくても(基本的に何も指定していなければ)最長マッチになるのだと思っていたのですが、違うんですね・・・(^^;そこが誤解の根でした(^^;
^ で先頭指定をしているわけではないので、明示的に .+ を付けなくても、.+(というか .* )が設定されているものとして処理されるものだと、今の今まで思っておりました(^^;;;

あと、確かに '/dev>' までが最長マッチでくるのなら、.*? と最短マッチにする必要はありませんね。(<div class=\"date\"> は複数出てこない HTML ファイルなので)

ありがとうございます。すっきりしました。


by markn(2012-08-09 22:48:54)

コメント拝見しました。お役に立てたようで良かったです。
.*(0文字以上の何かしらの文字) と .+ (1文字以上の...) は微妙に違うようで、場合によっては致命的な違いになりますのでご留意いただければと思います。

私もperlを使ってますが、私では普段扱わない分野についての記事があり書かれていて勉強になります。
また、perl以外の記事も興味深いものがあり、一読者として楽しませてもらってますのでこれからもよろしくお願いいたします。


コメント投稿
記事へ戻る

Powered by
MT4i 3.0.8