指向性メモ::2004-09-13::貪欲な場合、そうでもない場合

ページ情報
制作日
2004-09-13T19:20:21+09:00
最終更新日
2004-09-13T19:20:21+09:00
ページ内目次

従来型のNFAだと、選択肢のマッチは貪欲ではなかったらしい。完全に勘違いしていた。

従来型のNFAは選択肢があると、左から順に検査して、1度通過した時点で満足してしまう。後続に迫られない限りは、それ以上のバックトラックはしない。例えば、文字列「foo」に「f(o|oo)」をマッチさせようとすると「fo」がマッチした時点で終了する。

PHPのpreg関数は少なくとも見かけ上は従来型のNFAらしく(Perl互換だし)、実際に試してみると、上記と同じ結果になった。

逆に、ereg関数はPOSIX拡張なので、最長一致が保証されている。実験してみると、「fo」には満足せずにバックトラックを続け、「foo」にマッチした(バックトラックが増えるのでその分遅くなる)。

同じ正規表現でもかなり差があるので互換性に注意する必要がある。もっとも、個人的にはeregを使うことはまず無いので、あまり関係ないが。

Comments

Trackbacks

Trackback Ping URI

http://yudai.arielworks.com/memo/2004/09/13/192021.trackback

末尾に「1 + 2」の計算結果を繋げて下さい。例えば計算結果が「17」の場合、「192021.trackback17」です。これは機械的なトラックバックスパムを防止するための措置です。

Post a comment

Name (optional)
Email address or URI (optional)
Do the math below (required to filter comment spams)
1 + 2 + 2 =
Message (required)
Submit
連絡先、リンク、転載や複製などについては『サイト案内』をご覧ください。Powered by HIMMEL

I ♥ Validator