なぜ、正規表現は「先読み」部分のサブマッチを保管しない仕様なのでしょうか。
重複した文字列パターンの検索をするプログラムを作成中、
正規表現の先読み部分のサブマッチを利用したくなりました。
仕方なく、マッチ毎に先読み部を含む文字列を切り出してコピーし、
先読み部を改めて解析して必要とする文字列トークンを取り出しました。
もし「先読み」部分のサブマッチを保管すれば、一つの検索対象文字列の同じ部分が複数回サブマッチとして取り上げられる可能性が出てきます。
「後読み(戻り読み)」部分のサブマッチを保管しない理由は直感的に理解できます。
しかし先読み部分のサブマッチは取り出せるようにすべきだと思います。
単に正規表現や先読みの書籍や解説だけ紹介するようなご回答はご遠慮下さい。
「~のようにすればできます!」という解決・回避等の策は歓迎致します。
「その必要はない。質問自体おかしい。~だから。」というご意見は歓迎致します。
過去にそのような議論があったとか、そのURLを添付するようなご回答も歓迎致します。
括弧を使うので似たようなものだと思いがちですが、先読みも後読みも、対象文字列に対してマッチするのは、長さゼロの文字列だ、と考えると腑に落ちます。
"hogefuga" に対して、肯定先読みの /(?=fuga)/ にマッチするのは、hoge と fuga の間です。
行頭や行末を表す ^ や $ と同じだと考えれば、良いのだそうです。
実は、完全に受け売りで、目からうろこが落ちたのは、↓と、その参照先のページです。
http://d.hatena.ne.jp/ku__ra__ge/20070324/p2
参照先のページはロストしてますが、Internet Archive から 拾えます 。
--
(追記)
ご本人 (id:ku__ra__ge さん) を呼んでおけば良かったですね。
何か、良いこと書いてくれるかも。
ご回答頂きありがとうございます。
先読み部分のマッチは文字列の境界だという事なんですね。なるほどこれは分かりやすいです。
そして、先読み部分はサブマッチとして拾う為にあるのではないという事も明確です。
先読みに拘らずに、
重複した正規表現マッチの取り出し方を勉強すれば良いような気がしてきました。