akkun_choi pedia
mindia › akkun_choi pedia › 単語

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

akkun_choi · 2008-10-11 更新 · 履歴(2)
第 2 版(2008-10-11 19:09:32 · akkun_choi)を表示しています。 最新版に戻る

貪欲さ(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なんて置換し放題だぜー

履歴

タグ