使用正则表达式进行数组拆分

时间:2014-02-13 19:56:44

标签: regex arrays perl hash

我有一个只包含一个字符串的数组,它是哈希的值:

%hash = ("key"=>["Value1 unit(1), Value2 unit(2), Value3 unit"])

如何从散列值中分割" unit" - s并将其保存到数组中?

新数组应该是这样的:

@array=["Value1", "Value2", "Value3"]

我试过这种方式:

@array=split(/\s\w\(\w\)\,/, $hash{key});

4 个答案:

答案 0 :(得分:1)

在逗号上拆分字符串,然后在最后剥去单位。

map(s/\s.*$//, @array = split(/,\s*/, $hash{'key'}[0]));

答案 1 :(得分:1)

这是另一种选择:

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


my %hash = ("key"=>["1567 I(u), 2070 I(m), 2.456e-2 V(m), 417 ---, 12 R(k),"]);
my @array =  $hash{'key'}->[0] =~ /(\S+)\s+\S+,?/g;
print Dumper \@array;

输出:

$VAR1 = [
          '1567',
          '2070',
          '2.456e-2',
          '417',
          '12'
        ];

答案 2 :(得分:1)

另一种选择:

my %hash = ("key"=>["Value1 unit(1), Value2 unit(2), Value3 unit"]);

my $i;
my @array = grep { ++$i % 2 } split /,?\s/, $hash{key}->[0];

$, = "\n";
print @array;

答案 3 :(得分:0)

你可以用一个相对简单的正则表达式来完成:

@array = $hash{'key'}[0] =~ m/\s*(\S+)\s+\S+,?/g;

要知道的重要一点是,使用/g标志,正则表达式匹配器会返回所有捕获的($1$2等)组,从而全局匹配字符串。这个正则表达式有一个这样的组。

我的假设是:

  1. “Value1”,“Value2”部分只是非空白的块
  2. “unit(1)”,“unit(2)”,部分也只是非空白的块
  3. 如果这些都不是有效的假设,您可以使用与您的数据匹配的更具体的内容替换正则表达式的两个\S+部分。