電気ウナギ的○○

About Home

正規表現の最短マッチがようわからんようなったがな

shinoda (2012年8月 7日 19:03)
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

みたいに、頭に .+ という「任意の数文字」という条件を足すと、ちゃんと

わたしは恥知らずな夜のホームラン王よ!

だけを取ってくる。

何、これ?

正規表現の神よ、なんで .+ を付けるだけで結果が変わってくるのん?.*?って最短マッチしてるんだから、その前に任意の文字があろうがなかろうが関係ないやん。
なんでぇ?教えてぇ?

電気ウナギ的○○

電気ウナギ的○○

About Back

コメント(3)

markn |2012年8月 9日 15:07

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

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

markn |2012年8月 9日 22:48

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

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

電気ウナギ的○○

電気ウナギ的○○

About Back

トラックバック(0)

トラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/2152

電気ウナギ的○○

About This Site

電気ウナギ的○○
岩国在住。広島で働く超零細IT企業社長のいわゆる社長日記。
何か、酒と食い物のことばかり書いているようで・・・お察しのとおり、肥満体です:-)


2011/06/24
iPhone用サイト公開

Create with jQuery, jQTouch.


CLOSE