考える人、コードを書く人スマートフォン用の表示で見る考える人、コードを書く人この広告は、90日以上更新していないブログに表示しています。必然的にそんな話が多くなってしまうのかもしれない。平日の昼間は+とか*とか(?<=)とか(?:)みたいな記号が僕の頭の中を駆け巡っていたりする。いや、もちろんそんなことばっかりやってるわけじゃありませんが。文字列を指定の位置に挿入するPerlやその他巷でよく使われている(?)言語に搭載されている正規表現エンジンには文字列の指定の位置に文字列を挿入するために、先読み(?=)と戻り読み(?<=)の機能がある。この2つは指定した文字列自体ではなく、文字列の位置にマッチする。次の場合、$strの中身はabcdefghiとなる。$str);?>しかし、次のように可変長な正規表現でマッチさせようとすると固定長じゃないと使えませんよと怒られる。8Perlでも試してみたが、同じようなメッセージが表示された。昨日、これで少しハマったので、フクロウ本を読み返してみたら、可変長テキストによる戻り読みをサポートしているのは、.NETを含めたごく一部だけらしい(先読みは可変長でも問題ない)。以下のような記述がある。任意の可変長テキストにマッチできる戻り読みに出会うと、正規表現エンジンは文字列の先頭から戻り読み部分の表現をチェックする必要があるため、長い文字列の終わり近くでそのような戻り読みを要求されると、大変無駄な処理を強いられることになる。P.127)先頭からチェックし直す理由がよくわからなかったので、調べてみたのだが、ここによると、どうやら戻り読みを行う場合、正規表現エンジン内部では右から左にマッチが進むらしい。一例として、鬼車のソースを眺めてみると、確かに戻り読みの処理の部分では右から左に進んでいる。このため、可変長テキストの場合は先頭まで戻った後、再びその可変長な表現にマッチするか調べなければならないようだ。(つまり、↑に書かれてあるようにパフォーマンス的によろしくない)つか、何でこれを戻り読みって言うのかわからなかったんだけど、内部で戻りながら読んでるってことだったのね。ちなみにRuby1.8.5のソースも眺めてみたのだが、こっちはそもそも戻り読みの機能自体がない模様。鬼車のソースを眺めてみると、この機能が実装されているっぽいので、そのうち使えるようになるんだろうけど。先読みや戻り読みを使った挿入はキャプチャを使って書き直すことができる。$str);?>なんか冗長な気がするが、こっちの方がわかりやすい気もする。Talksを開催しましたnginx実践入門出版記念イベントの開催と参加者募集のお知らせArchiveはてなブログをはじめよう!cubicdaiyaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。