Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PHPの正規表現と最長一致

1,977 views

Published on

第29回PHP勉強会発表資料です

Published in: Technology
  • Be the first to comment

PHPの正規表現と最長一致

  1. 1. PHPの正規表現と 最長一致 hanawa (a.k.a. id:hnw) y at hnw dot jp 第29回PHP勉強会発表資料 13年10月15日火曜日
  2. 2. 第29回記念大会 •PHP勉強会おなじみのmagic number •次回記念大会は第0x29回(1年後) 13年10月15日火曜日
  3. 3. アンケート •正規表現に苦手意識がありますか? •最長一致って聞いたことありますか? 13年10月15日火曜日
  4. 4. クイズ •正規表現「(a+)(([ab][ab])+)」を aaabbbに対して適用した結果は? 1. aaabb 2. aaabbb 3. その他 13年10月15日火曜日
  5. 5. クイズの答え合わせ •正解:(1) aaabb (preg_match, mb_ereg) •(2) aaabbb が正解のこともある(ereg) →「最長一致」って何? 13年10月15日火曜日
  6. 6. 最長一致? •実は日本語の「最長一致」には2種類 •greedy matching (PCRE, preg_match/mb_ereg) •longest matching(POSIX, ereg) •greedyも「最長」と翻訳→ほぼ誤訳 13年10月15日火曜日
  7. 7. greedy matching •greedy matching=欲張りマッチ •繰り返し表現を最大回数マッチさせる •以降の表現を試して失敗したら、繰り 返し回数を減らして以降の表現を試す (バックトラック) •それでもダメなら開始位置をずらす 13年10月15日火曜日
  8. 8. クイズの解説 •「(a+)(([ab][ab])+)」を aaabbbに対して適用 •a+が可能な限り長くマッチ→aaa •bbbで([ab][ab])+を試す→bb •正規表現全体が最長とは限らない 13年10月15日火曜日
  9. 9. longest matching •longest matching=最長一致 •全体が最長→aaabbb •先に出現した表現が最長 •実装コストが(おそらく)高い •検索コストも? 13年10月15日火曜日
  10. 10. •正規表現 「a+([ab][ab])+」 •文字列aaabbb greedy matching図解 Ea [ab] マッチング失敗、終了 or マッチング開始位置を1文字後ろに S [ab] a baa b b a 13年10月15日火曜日
  11. 11. •正規表現 「a+([ab][ab])+」 •文字列aaabbb •繰り返しを優先 greedy matching図解 Ea [ab] マッチング失敗、終了 or マッチング開始位置を1文字後ろに S [ab] a baa b b a a a 13年10月15日火曜日
  12. 12. •正規表現 「a+([ab][ab])+」 •文字列aaabbb •繰り返しを優先 greedy matching図解 Ea [ab] マッチング失敗、終了 or マッチング開始位置を1文字後ろに S [ab] a baa b b a a a [ab] [ab] 13年10月15日火曜日
  13. 13. まとめ •POSIX正規表現=longest matching •性能↓の可能性:PCREを使おう •PCRE=greedy matching •「最長」は誤訳/繰り返しを欲張る 13年10月15日火曜日
  14. 14. ご清聴 ありがとう ございました 13年10月15日火曜日

×