我使用递归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++