Perl正则表达式用于多字符嵌套括号



我使用递归Perl正则正则表达式来扫描嵌套的单字符括号:

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

这让我可以扫描c函数调用,就像:

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

匹配"((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)((?:(?>(?!(?:bifb|bends+if))+)|(??{$RE_if}))*)
(?:bends+if))';

但是它不工作。有人有处理多字符括号的正则表达式吗比如["if","end if"] ?

——问候康拉德

让我们看看原来的模式:(移除了多余的转义。去除不必要的周围(?:))

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

(?:(?!STRING).)*之于STRING,正如[^CHAR]*之于CHAR,所以:

bifb
(
   (?: (?> (?:(?! b(?:ends+)?ifb ).)+ )
   |   (??{ $RE })
   )*
)
bends+ifb

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

最新更新