レベル付き後方参照

手元では、7/12日のコメントの例が動いた。
stag -> nameの二段呼び出しと、etag呼び出しの一段階の差なので、\kとなる。

r = Regexp.compile(<<’__REGEXP__’.strip, Regexp::EXTENDED)
(?<element> ¥g<stag> ¥g<content>* ¥g<etag> ){0}
(?<stag> < ¥g<name> ¥s* > ){0}
(?<name> [a-zA-Z_:]+ ){0}
(?<content> [^<&]+ (¥g<element> | [^<&]+)* ){0}
(?<etag> </ ¥k<name+1> >){0}
¥g<element>
__REGEXP__
r.match(’<foo>f<foo>fff</foo>f</foo>’).captures
r.match(’<foo>f<bar>bbb</bar>f</foo>’).captures