如何在Perl中的匹配大括号之间提取字符串?

Sri*_*esh 10 regex perl parsing matching braces

我的输入文件如下:

HEADER 
{ABC|*|DEF {GHI 0 1 0} {{Points {}}}}

{ABC|*|DEF {GHI 0 2 0} {{Points {}}}}

{ABC|*|XYZ:abc:def {GHI 0 22 0} {{Points {{F1 1.1} {F2 1.2} {F3 1.3} {F4 1.4}}}}}

{ABC|*|XYZ:ghi:jkl {JKL 0 372 0} {{Points {}}}}

{ABC|*|XYZ:mno:pqr {GHI 0 34 0} {{Points {}}}}

{
    ABC|*|XYZ:abc:pqr {GHI 0 68 0}
        {{Points {{F1 11.11} {F2 12.10} {F3 14.11} {F4 16.23}}}}
        }
TRAILER
Run Code Online (Sandbox Code Playgroud)

我想将文件解压缩到如下数组:

$array[0] = "{ABC|*|DEF {GHI 0 1 0} {{Points {}}}}"

$array[1] = "{ABC|*|DEF {GHI 0 2 0} {{Points {}}}}"

$array[2] = "{ABC|*|XYZ:abc:def {GHI 0 22 0} {{Points {{F1 1.1} {F2 1.2} {F3 1.3} {F4 1.4}}}}}"

..
..

$array[5] = "{
    ABC|*|XYZ:abc:pqr {GHI 0 68 0}
        {{Points {{F1 11.11} {F2 12.10} {F3 14.11} {F4 16.23}}}}
        }"
Run Code Online (Sandbox Code Playgroud)

这意味着,我需要将第一个开口花括号与其闭合花括号相匹配,并在其间提取弦.

我已查看以下链接,但这不适用于我的问题. 正则表达式在花括号之间获取字符串"{我想在花括号之间有什么}}"

我正在努力,但如果有人可以帮助我完成他们的专业知识,我会很有帮助

谢谢斯里兰卡

Eri*_*rom 14

至少在现代版本的Perl中,这肯定可以用正则表达式完成:

my @array = $str =~ /( \{ (?: [^{}]* | (?0) )* \} )/xg;

print join "\n" => @array;
Run Code Online (Sandbox Code Playgroud)

正则表达式匹配一个大括号块,它包含非大括号字符或递归到自身(匹配嵌套大括号)

编辑:上面的代码在Perl 5.10+中工作,对于早期版本,递归有点冗长:

my $re; $re = qr/ \{ (?: [^{}]* | (??{$re}) )* \} /x;

my @array = $str =~ /$re/xg;
Run Code Online (Sandbox Code Playgroud)


Zai*_*aid 5

我同意 ysth 使用该Text::Balanced模块的建议。几行就可以让您上路。

use strict;
use warnings;
use Text::Balanced qw/extract_multiple extract_bracketed/;

my $file;
open my $fileHandle, '<', 'file.txt';

{ 
  local $/ = undef; # or use File::Slurp
  $file = <$fileHandle>;
}

close $fileHandle;

my @array = extract_multiple(
                               $file,
                               [ sub{extract_bracketed($_[0], '{}')},],
                               undef,
                               1
                            );

print $_,"\n" foreach @array;
Run Code Online (Sandbox Code Playgroud)

输出

{ABC|*|DEF {GHI 0 1 0} {{Points {}}}}
{ABC|*|DEF {GHI 0 2 0} {{Points {}}}}
{ABC|*|XYZ:abc:def {GHI 0 22 0} {{Points {{F1 1.1} {F2 1.2} {F3 1.3} {F4 1.4}}}}}
{ABC|*|XYZ:ghi:jkl {JKL 0 372 0} {{Points {}}}}
{ABC|*|XYZ:mno:pqr {GHI 0 34 0} {{Points {}}}}
{
    ABC|*|XYZ:abc:pqr {GHI 0 68 0}
        {{Points {{F1 11.11} {F2 12.10} {F3 14.11} {F4 16.23}}}}
        }
Run Code Online (Sandbox Code Playgroud)