Oniguruma についてひとつ要望があります。

パターン中で、同じ部分パターンを複数記述しなければならない時に、最初の
ひとつだけを記述して、後の部分は最初のを参照するような機能を入れられな
いでしょうか?

仮に参照を行なう構文を (?*n) とし、n 番目の group (shy group を含む)を
参照するとすると、/(?:a+)(?*1)/ が /(?:a+)(?:a+)/ と等価になるというよ
うなものです。
# 後方参照とは異なり、マッチした文字列ではなく、パターンそのものが入り
# ます。

# なお、番号ではなく、group に名前が付けられて、名前で参照できるという
# ほうが望ましいです。

ただし、内部的に複製は行なわないで部分パターンを共有するというのが前提
です。

なぜこんな機能が欲しいかというと、DFA から正規表現に変換したいからです。
正規表現は等価な DFA に比較的簡単に変換でき、DFA はマッチの条件を逆に
したり、複数の DFA の共通部分にしかマッチしないような DFA を求めたりと
いった操作が比較的簡単に行なえます。こういう操作ができると、いろいろと
面白い DFA が簡単に生成できます。そこで、DFA から正規表現に変換してパ
ターンマッチングに使えるといろいろと楽しいわけです。

ところが、残念ながら、DFA から正規表現への変換は今のところ困難です。
この変換は理論的には可能なのですが、DFA の大きさに対して正規表現の大き
さが指数関数的になってしまうので非現実的な結果になってしまうことが多々
あります。

例えば、http://www.din.or.jp/~ohzaki/regex.htm によれば、ISBN にマッチ
する正規表現は 105488889066bytes になるそうです。当然ですが、こんなパ
ターンは動作させることはおろか、生成することもままなりません。

ここで、なぜこんな非現実的な大きさになるかというと、正規表現の複製が大
量に行なわれるからです。そこで、パターンの複製を行なわずに共有できれば
問題は解決します。というわけで冒頭の提案のように部分パターンを共有でき
る機能があるといいなぁ、ということになるんですが、これは困難でしょうか?

なお、目的は DFA からの変換だけなので、共有部分で後方参照やや zero
width assertion など、理論的な正規表現以外のものが使えなくてもまったく
問題ありません。むろん、自分自身を含むような部分パターンを参照すること
も必要ありません。
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)