基礎には載ってない正規表現の履歴
貪欲さ(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>" [(.*)] => "いちばんめ"