In article <446F00A4.80606 / airemix.com>,
  "NARUSE, Yui" <naruse / airemix.com> writes:

> nested_parentheses = /(?<pare>\(([^\(\)]+|\g<pare>)*\))/
>
> これだとちゃんとマッチします。
> もっとも、閉じる方向で括弧が余計な場合は大丈夫ですが、
> 開き括弧が余計にある場合は固まりますが。

([^\(\)]+)* と、繰り返しが 2重になって、括弧が出てこない部分
のありとあらゆる分割に挑戦するからでしょう。

たとえば、aaaaaaa は
aaaaaaa
aaaaaa a
aaaaa aa
aaaaa a a
aaaa aaa
aaaa aa a
aaaa a aa
aaaa a a a
aaa aaaa
aaa aaa a
aaa aa aa
aaa aa a a
aaa a aaa
aaa a aa a
aaa a a aa
aaa a a a a
aa aaaaa
...
というように分割できて、これを全部試せばそりゃ時間がかかりま
す。

挑戦しないようにするには、そんなところで分割しないようにすれ
ばいいわけで、
1. [^()]+ 同士が隣接しないようにパターンの構造を変える、
2. 直後が括弧であると先読みで指定する、
3. バックトラックを抑制する、
といった方法があります。

nested_parentheses = /
 (?<text>   [^()]*                                    ){0}
 (?<pare>    \g<text> ( \(\g<pare>\) \g<text> )*      ){0}
 \A\g<pare>\z/x

nested_parentheses = /
 (?<pare>    ( [^()]+(?=[()]) | \(\g<pare>\) )*       ){0}
 \A\g<pare>\z/x

nested_parentheses = /
 (?<pare>    ( (?> [^()]+ ) | \(\g<pare>\) )*         ){0}
 \A\g<pare>\z/x
-- 
[田中 哲][たなか あきら][Tanaka Akira]