我有一个如下所示的字符串
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。
答案 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