質問: とりあえず、サクラエディタで使われてたonigumo 5.13.5とubuntuのperl 5.14.2で試してみましたが、どちらも『この正規表現はおかしい』とのエラーが出てしまいました。 以下のような文字列があった時に、後読み、先読みを含めた`(?<=\d)hoge(?=\d)`というキーワードで検索すると、『1hoge1』『3hoge2』中の『hoge』がhitします。 ``` 1hoge1 2hogeA 3hoge2 4hogeB Ahoge4 BhogeC Choge5 DhogeD Ehoge7 ``` ここまでは良いのですが、キーワードに`(?<=\d+)hoge(?=\d)`のように量指定子を加えると正規表現として正しくないと怒られてしまいます。 『+』『*』『?』で試してみましたが、全てダメでした。 これは、環境依存によって発生しているのでしょうか? それとも、正規表現としてこの書き方を認めていないのでしょうか? 新しいversionのperlやruby使えば認められる書き方なんでしょうか? 情報お待ちしております。よろしくお願いします。
回答: 正規表現の実装によります。各種エンジンでlookbehindに量指定子が使えるかどうかは、次のドキュメントに簡潔にまとまっています。OnigumoおよびPerl5の実装では(今のところ)使えないということです。 (ここには挙げられていませんが、Gaucheの正規表現もlookbehindで量指定子が使えます) 少し込み入った話をすると、「正規表現」というのはひとつの決まった定義があるわけではないので、「正規表現でこれはできますか?」という質問は「どの正規表現」かを言わないと曖昧です。もともとの「正規表現」は形式言語の理論の用語で、それにはきちんとした定義がありますが、そこで扱われるのは繰り返し、連接、選択などごく限られた機能だけです。プログラミング言語に取り入れられてから、実用上便利なように様々な拡張機能が付加されてきました。プログラミング界で言語を越えた仕様としてはPOSIXで定められたものがありますが、それもかなり機能が限られています。現代的に様々な拡張機能(lookahead, lookbehind assertionを含む)をてんこ盛りにしたリッチな正規表現を広めたのはおそらくPerlの功績だと思います。Perlの正規表現がポピュラーになったので、その仕様に準じた正規表現の実装がいくつか登場しました。ただ、今でも設計方針の違いから独自に正規表現を実装することはあり、その際にどの機能をどういう仕様で採り入れるかは設計者の選択によります。