基礎には載ってない正規表現の履歴

貪欲さ(greedy)


状況
 HTMLで、あるタグの中身だけ取得したい。そこで次のようなパターンを考えた。

パターン

|<div>(.*)</div>|


文字

<div>いちばんめ</div><div>にばんめ</div>


結果

  [全体でのマッチ] => "<div>いちばんめ</div><div>にばんめ</div>"
  [(.*)] => "いちばんめ</div><div>にばんめ"


「いちばめ」だけを取りたいのに…!

何故こうなるかというと量指定子(*,+)は「貪欲」だからだ。貪欲である場合はパターンにマッチするものを貪欲に確保していく。

貪欲な場合

<div>*********************************** ←まず最後まで(.*)が確保
<div>いちばんめ</div><div>にばんめ</div>

<div>*****************************</div> ←後ろから調べる
<div>いちばんめ</div><div>にばんめ</div>

貪欲でない場合

<div>**                                  ←前から調べる
<div>いちばんめ</div><div>にばんめ</div>

<div>**********</div>                    ←</div>が見つかった!!
<div>いちばんめ</div><div>にばんめ</div>



貪欲でないようにするには(*?,+?)とすれば良い。
(またはU修飾子で変える手もある)

パターン

|<div>(.*?)</div>|


文字

<div>いちばんめ</div><div>にばんめ</div>


結果

  [全体でのマッチ] => "<div>いちばんめ</div>"
  [(.*)] => "いちばんめ"


やったぜ!これでHTMLて置換し放題だぜー