From: "K.Kosako" Date: 2002-04-04T11:17:43+09:00 Subject: [ruby-dev:16744] Re: sharing sub-regexp Tanaka Akiraさんのから > パターン中で、同じ部分パターンを複数記述しなければならない時に、最初の > ひとつだけを記述して、後の部分は最初のを参照するような機能を入れられな > いでしょうか? > > 仮に参照を行なう構文を (?*n) とし、n 番目の group (shy group を含む)を > 参照するとすると、/(?:a+)(?*1)/ が /(?:a+)(?:a+)/ と等価になるというよ > うなものです。 > # 後方参照とは異なり、マッチした文字列ではなく、パターンそのものが入り > # ます。 > > ただし、内部的に複製は行なわないで部分パターンを共有するというのが前提 > です。 サイズが問題だから共有するということは、 元のパターンだけでなくて、生成されたバイトコードも共有するということですよね。 共有された部分の実行を、関数呼び出しのように実行するために、 スタックと命令コードのを新規追加すれば可能ではないかと思います。 (呼び出しではない直接実行の場合も、呼び出しのように実行しなければいけない ので、速度的には不利と思いますが。実用に適さないほど遅くなるかどうかは不明。) > # なお、番号ではなく、group に名前が付けられて、名前で参照できるという > # ほうが望ましいです。 今は、()にしか番号を振っていませんので、名前で参照する方法だけにしたほうが 良いと思います。 名前定義グループと名前参照の二個分、ノードの種類を増やしてやればできるような 気がします。 私が拡張を行うとすれば、Rubyに取り込まれて実用に耐えることが確認できた後に なると思います。 面倒そうなので、私以外の人に拡張してもらってもいいですけど。 (正規表現の拡張なので、まつもとさんに確認が必要でしょうが。) -- 小迫@ソフネック 渋谷区恵比寿1-15-1