我使用递归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”]?
- 问候康拉德
答案 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++
。