1

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

$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))';

但这有点行不通。有人有一个正则表达式来处理像 ["if","end if"] 这样的多字符括号吗?

——问候康拉德

4

1 回答 1

1

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

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

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

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

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

于 2013-06-02T22:08:51.900 回答