使用嵌套逗号分割Perl正则表达式

时间:2014-02-18 23:07:43

标签: regex perl

我有一个键值对字符串,其中对以逗号分隔,但值有嵌套逗号。

离。

"key1|val1,key2|val2_a,val2_b,val2_c,key3|val3"

我想将其分解为哈希并使用以下内容进行攻击:

my $str = "key1|val1,key2|val2_a,val2_b,val2_c,key3|val3";
my @vars = split(/([^,\s]+)\|/ ,$str);
my @arr = splice @vars, 1;
my %hash  = @arr;
print Dumper(\%hash);

给了我:

$VAR1 = {
      'key2' => 'val2_a,val2_b,val2_c,',
      'key1' => 'val1,',
      'key3' => 'val3'
    };

我正在寻找一种更优雅的方式来做到这一点。我认为它可以用一个正则表达式来完成,但我无法搞清楚它。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:4)

尝试在分割中使用正向前瞻。

#!/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $str = "key1|val1,key2|val2_a,val2_b,val2_c,key3|val3";
my %hash = split(/\||,(?=\w+\|)/, $str);

print Dumper(\%hash);

输出:

$VAR1 = {
          'key2' => 'val2_a,val2_b,val2_c',
          'key1' => 'val1',
          'key3' => 'val3'
        };

我发现这个tutorial可以很好地解释周围环境。

答案 1 :(得分:1)

难以决定每个键的值列表的结束位置。最明显的是它可以在字符串的末尾,或者更加模糊,在另一个键值对开始的地方。 (这是一个可怕的设计。可以在找到更难解决的问题之前修复它吗?)

此解决方案通过为"键"定义正则表达式来工作。 string(除了管道,逗号或空格之外的任何东西),然后用它来构建一个完整的键值对的模式,它在字符串的末尾或另一个"逗号 - 键 - 管道&#34结束;序列开始。

use strict;
use warnings;

my $s = 'key1|val1,key2|val2_a,val2_b,val2_c,key3|val3';

my $key_re = qr/ [^|,\s]+ /x;

my @pairs = $s =~ / $key_re \| [^|\s]+ (?= \z | , $key_re \| )/gx;

print "$_\n" for @pairs;

<强>输出

key1|val1
key2|val2_a,val2_b,val2_c
key3|val3