2

文字列があるとします:

my $string = "foo{a},bar{b}, baz{c,d,e}";

グループ化文字のセットを使用して 2 つのレベルを区別します。

$grouping_characters = "{}"

,この文字列を「外側」のコンマ ( ) で分割し、内部のすべてを考慮したいと思います$grouping_characters

上記の例では、出力は次のようになります。

my @result = ("foo{a}", "bar{b}", "baz{c,d,e}")

Perlでこれを行うにはどうすればよいですか?

4

5 に答える 5

1

あなたは試すことができます:

my $string = "foo{a},bar{b}, baz{c,d,e}";

print join(",",split(/,\s*(?=\w+{[a-z,]+})/g,$string));
于 2013-07-30T00:52:38.183 に答える
1

この正規表現を使用してみてください:

(.*[}]),\s*(.*[}]),\s*(.*[{].*[}])

そのようです:

my $string = "foo{a},bar{b}, baz{c,d,e}";

print grep(/(.*[}]),\s*(.*[}]),\s*(.*[{].*[}])/, $string);
于 2013-07-30T00:43:26.067 に答える
1

シンプルなパーサー:

#!/usr/bin/perl
use warnings;
use strict;

my $string = 'foo{a},bar{b}, baz{c,d,e}';
my @parts;

my $inside;
my $from = 0;
for my $i (0 .. length $string) {

    my $char = substr $string, $i, 1;

    if ('{' eq $char) {
        $inside++;

    } elsif ('}' eq $char) {
        $inside--

    } elsif (',' eq $char and not $inside) {
        push @parts, substr $string, $from, $i - $from;
        $from = $i + 1;
    }
}

push @parts, substr $string, $from;
print "$_\n" for @parts;

空白の削除は、読者の演習として残されています。

于 2013-07-30T00:56:39.843 に答える