与Perl中的正则表达式相关

时间:2016-06-06 17:45:12

标签: arrays regex perl

我在一些文本文件中写了一个字符串 -

A[B[C[10]]]

我需要提取此字符串中使用的数组的信息。例如,我必须将信息存储在一个数组中,

@str = (A[], B[], C[10])

我想在 Perl 中使用正则表达式完成此事。 我希望解决方案适用于数组内部的每种情况,如此

A[B[C[D[E[F[10]]]]]]

那么,如何创建@str 数组

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式模式递归地解析此字符串,并调用Perl代码来保存中间值

喜欢这个

use strict;
use warnings 'all';
use v5.14;

my @items;
my $i;

my $re = qr{
    ([A-Z]\[)    (?{ $items[$i++] = $^N })
    (?:
        (?R)
        | 
        (\d+)    (?{ $items[$i-1] .= $^N })
    )
    \]           (?{ $items[--$i] .= ']' })
}x;

my $s = 'A[B[C[D[E[F[10]]]]]]';


use Data::Dump;

(@items, $i) = ();
dd \@items if 'A[B[C[10]]]' =~  /$re/g;

(@items, $i) = ();
dd \@items if 'A[B[C[D[E[F[10]]]]]]' =~  /$re/g;

输出

["A[]", "B[]", "C[10]"]
["A[]", "B[]", "C[]", "D[]", "E[]", "F[10]"]

答案 1 :(得分:0)

正则表达式+拆分以简洁的方式将其拉出来:

use v5.14;
my $s = 'A[B[C[D[E[F[10]]]]]]';

$s =~ s/(\w)\[(\d+)?\]*/\1\[\2\] /g;
my @str = split(/ /, $s);

map{print "$_\n"}@str;

打印出来:

A[]
B[]
C[]
D[]
E[]
F[10]