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

Regex Perl正则表达式匹配最长序列,regex,perl,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" 我尝试

我有一根像下面这样的线

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"
我尝试了类似于
(和[@\w]+=[“\w]+)*\]
的方法,它只返回最后一个匹配的
和@test2=“t2”
。完全没有想法。有什么帮助吗

编辑:
实际上,
@test1=“t1”
模式的数量不是固定的。正则表达式必须适合这种情况。Thnx@Pietzcker。

您可以这样做:

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'
        ];

使用重复捕获组时,每个新匹配项都将覆盖以前的任何匹配项

所以你只能用正则表达式做一个“全部查找”,比如

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

@result=$subject=~m/(?这将为您提供映射“@test1”=>“t1”的哈希值,依此类推:

my %matches = ($str =~ /and (\@\w+)="(\w+)"/g);
解释:/g全局匹配将为您提供一系列匹配,如 “@test1”、“t1”、“@test2”、“t2”

当哈希%matches被分配给这个数组时,perl将通过将数组作为键值对来自动转换为哈希。 因此,哈希%matches将包含您要查找的内容,并采用良好的哈希格式。

这对我很有用:

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

@test1
t1
@test2
t2

你事先知道参数的数量吗(看起来不是这样,在这种情况下,你不能用反向引用来做)?还有,你为什么不想让
@me
samiron
匹配呢?哦,是的..实际上是
@test1=“t1”的数量“
模式不是固定的。问这个问题的原因是……我需要的正则表达式必须适合这种情况。我会在我的问题中添加这个。@TimPietzcker:在真实场景中,有一些不同的东西代替了
@me=“samiron”
我不需要那个部分。或者我可以说,我需要跳过第一部分。
[@\w]+
也会匹配不以
@
开头的单词。我猜从Q开始,单词总是以
@
开头。不,他不想让“@me”和“samiron”匹配。