gpt4 book ai didi

regex - Perl 正则表达式 : match nested brackets

转载 作者:行者123 更新时间:2023-12-04 02:32:58 25 4
gpt4 key购买 nike

我正在尝试匹配嵌套 {} Perl 中带有正则表达式的括号,以便我可以从文件中提取某些文本片段。这是我目前所拥有的:

my @matches = $str =~ /\{(?:\{.*\}|[^\{])*\}|\w+/sg;

foreach (@matches) {
print "$_\n";
}

在某些时候,这会按预期工作。例如,如果 $str = "abc {{xyz} abc} {xyz}"我获得:

美国广播公司
{{xyz} abc}
{xyz}

正如预期的那样。但是对于其他输入字符串,它不会按预期运行。例如,如果 $str = "{abc} {{xyz}} abc" ,输出为:

{abc} {{xyz}}
美国广播公司

这不是我所期望的。我本来想要 {abc}{{xyz}}放在单独的行上,因为每个行都在括号方面是平衡的。我的正则表达式有问题吗?如果是这样,我将如何修复它?

最佳答案

你很惊讶你的模式是如何匹配的,但没有人解释吗?以下是您的模式匹配方式:

my @matches = $str =~ /\{(?:\{.*\}|[^{])*\}|\w+/sg;
^ ^ ^ ^ ^ ^
| | | | | |
{ ---------------------+ | | | | |
a --------------------------)-)-)--+ |
b --------------------------)-)-)--+ |
c --------------------------)-)-)--+ |
} --------------------------)-)-)--+ |
--------------------------)-)-)--+ |
{ --------------------------+ | | |
{ ----------------------------+ | |
x ----------------------------+ | |
y ----------------------------+ | |
z ----------------------------+ | |
} ------------------------------+ |
} ----------------------------------------+

如您所见,问题在于/ \{.*\}/匹配太多。里面应该有什么匹配的东西
(?: \s* (?: \{ ... \} | \w+ ) )*

哪里 ...
(?: \s* (?: \{ ... \} | \w+ ) )*

所以你需要一些递归。命名组是执行此操作的一种简单方法。
say $1
while /
\G \s*+ ( (?&WORD) | (?&BRACKETED) )

(?(DEFINE)
(?<WORD> \s* \w+ )
(?<BRACKETED> \s* \{ (?&TEXT)? \s* \} )
(?<TEXT> (?: (?&WORD) | (?&BRACKETED) )+ )
)
/xg;

但是与其重新发明轮子,不如使用 Text::Balanced .

关于regex - Perl 正则表达式 : match nested brackets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15301708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com