koba::blog

小林聡: プログラマです

PukiWikiのプラグインの正規表現

こんな感じかな。

my $plugin_regex;
$plugin_regex
    = qr/
            &\w+
            (?: \( .*? \) )?
            (?: { (?: (??{$plugin_regex}) | .*? )+ } )?
            ;
        /x;

動的正規表現を使えない場合は、こんな感じで5段の入れ子までは大丈夫。

my $p1           = qr/&\w+(?:\(.*?\))?(?:{(?:.*?)+})?;/;
my $p2           = qr/&\w+(?:\(.*?\))?(?:{(?:$p1|.*?)+})?;/;
my $p3           = qr/&\w+(?:\(.*?\))?(?:{(?:$p2|.*?)+})?;/;
my $p4           = qr/&\w+(?:\(.*?\))?(?:{(?:$p3|.*?)+})?;/;
my $plugin_regex = qr/&\w+(?:\(.*?\))?(?:{(?:$p4|.*?)+})?;/;