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”匹配。