Perl正则表达式匹配最长序列

时间:2012-10-19 07:26:29

标签: regex perl

我有一个如下所示的字符串

atom:link[@me="samiron" and @test1="t1" and @test2="t2"]

我需要一个正则表达式,它将生成以下后向引用

#I would prefer to have
$1 = @test1
$2 = t1
$3 = @test2
$4 = t2

#Or at least. I will break these up in parts later on.
$1 = @test1="t1"
$2 = @test2="t2"

我尝试过类似( and [@\w]+=["\w]+)*\]的内容,只返回上一个匹配and @test2="t2"。完全没有想法。有什么帮助吗?

修改 实际上@test1="t1"模式的数量并不固定。正则表达式必须符合这种情况。 Thnx @Pietzcker。

4 个答案:

答案 0 :(得分:1)

你可以这样做:

my $text = 'atom:link[@me="samiron" and @test1="t1" and @test2="t2"]';
my @results;
while ($text =~ m/and (@\w+)="(\w+)"/g) {
  push @results, $1, $2;
}
print Dumper \@results;

结果:

$VAR1 = [
          '@me',
          'samiron',
          '@test1',
          't1',
          '@test2',
          't2'
        ];

答案 1 :(得分:1)

这将为您提供映射“@ test1”=>的哈希值“t1”等等:

my %matches = ($str =~ /and (\@\w+)="(\w+)"/g);

说明:/ g全局匹配将为您提供一系列匹配项 “@ test1”,“t1”,“@ test2”,“t2”,...

当哈希%匹配分配给此数组时,perl会通过将数组视为键值对自动将数组转换为哈希。 因此,哈希%匹配将包含您以漂亮的哈希格式寻找的内容。

答案 2 :(得分:0)

当您使用重复捕获组时,每个新匹配都将覆盖之前的任何匹配。

所以你只能做一个"找到所有"像正则表达式

@result = $subject =~ m/(?<= and )([@\w]+)=(["\w]+)(?= and |\])/g;

获取所有匹配的数组。

答案 3 :(得分:0)

这对我有用:

@result = $s =~ /(@(?!me).*?)="(.*?)"/g;
foreach (@result){
    print "$_\n";
}

输出结果为:

@test1
t1
@test2
t2