入れ子のマッチ
正規表現の中に自己を含めて循環定義できるRubyやPerlなどの処理系なら、入れ子もなんとか処理できるみたいです。
http://leoclock.blogspot.com/2009/01/blog-post_27.html
括弧のパターンにマッチすると、その都度中身の正規表現がlazyに変わっていくというトリッキーな技です。
これはperlの言語側の変数を参照して再帰しているので、正規表現の中だけで再帰させることを考える。
実際には?>や?:を使ってチューニングするが、ここでは見ためをシンプルにするために省略(ということにしておく)
PHP(PCRE)の場合
$str = "(a (b, c)), (d), (e, f)"; preg_match_all('/\(([^()]|(?R))*\)/',$str,$r); echo join("\n",$r[0]);
実行結果
(a (b, c)) (d) (e, f)
Ruby1.9(鬼車)の場合
str = "(a (b, c)), (d), (e, f)" puts str.scan(/(?<R>\(([^()]|\g<R>)*\))/).join("\n")
実行結果は同じなので省略
鬼車では名前をつけずに全体式を参照する(?R)のような記法は無いのかな?
http://d.hatena.ne.jp/atzy/20080910
http://www.kt.rim.or.jp/~kbk/regex/regex.html
http://jp2.php.net/manual/ja/regexp.reference.php
参考にさせていただきました。