用于multichar嵌套括号的Perl正则表达式

时间:2013-06-02 21:55:22

标签: regex perl

我使用递归Perl常规reg-expression来扫描嵌套的singlechar括号:

$RE =     qr'(?:[\(]((?:(?>[^\(\)]+)|(??{$RE}))*)[\)])';

这让我可以扫描c函数调用,例如:

"func (a(b()))" ~= /$RE/

匹配“(a(b()))”。现在我想解析Pascal样式的嵌套[if,if-end]括号,即:

if (a) then
   if (b) then
     blaif := 1;
   else 
     blaend := 2;
   end if;
end if;

我尝试将$ RE从上面重写为:

$RE_if  =  qr'(?:(?:if)((?:(?>(?!(?:\bif\b|\bend\s+if))+)|(??{$RE_if}))*)\
(?:\bend\s+if))';

但它有点不起作用。有人有一个处理multichar括号的正则表达式 喜欢[“if”,“end if”]?

- 问候康拉德

1 个答案:

答案 0 :(得分:1)

让我们看看原始模式:(删除了无关的转义。删除了不必要的周围(?:)。)

[(]                  # Prefix.
(
   (?: (?> [^()] +)  # Some characters containing neither prefix nor suffix.
   |   (??{ $RE })   # Recursion
   )*
)
[)]                  # Suffix.

(?:(?!STRING).)*STRING[^CHAR]*CHAR,所以:

\bif\b
(
   (?: (?> (?:(?! \b(?:end\s+)?if\b ).)+ )
   |   (??{ $RE })
   )*
)
\bend\s+if\b

顺便说一下,(?>PAT+)可以写成PAT++