我有一个像"Test string has tes value like abc="123",bcd="345",or it it can be xyz="4567" and ytr="434""
这样的字符串。
现在我想在等号后获取值。哈希结构如下:
$hash->{abc} =123,
$hash->{bcd} =345,
$hash->{xyz} =4567,
我试过这个$str =~ / (\S+) \s* = \s* (\S+) /xg
答案 0 :(得分:3)
正则表达式返回捕获的对,可以将其分配给散列,匿名。
use warnings 'all';
use strict;
use feature 'say';
my $str = 'Test string has tes value like abc="123",bcd="345",or it '
. 'it can be xyz="4567" and ytr="434"';
my $rh = { $str =~ /(\w+)="(\d+)"/g }
say "$_ => $rh->{$_}" for keys %$rh ;
打印
bcd => 345 abc => 123 ytr => 434 xyz => 4567
发表评论 - 针对=
符号周围的可能空格,将其更改为\s*=\s*
。
答案 1 :(得分:1)
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $string = q{Test string has tes value like abc="123",bcd="345" and xyz="523"};
my %hash = $string =~ /(\w+)="(\d*)"/g;
print Dumper \%hash;
输出
$VAR1 = {
'xyz' => '523',
'abc' => '123',
'bcd' => '345'
};
答案 2 :(得分:0)
您的测试字符串如下所示(稍微编辑以修复引用问题)。
'Test string has tes value like abc="123",bcd="345",or it it can be xyz="4567" and ytr="434"'
我用这段代码来测试你的正则表达式:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper;
my $text = 'Test string has tes value like abc="123",bcd="345",or it it can be xyz="4567" and ytr="434"';
my %hash = $text =~ /(\S+)\s*=\s*(\S+)/g;
say Dumper \%hash;
这给出了这个输出:
$VAR1 = {
'abc="123",bcd' => '"345",or'
'ytr' => '"434"',
'xyz' => '"4567"'
};
问题是\S+
匹配任何非空白字符。这太过分了。您需要对有效字符更具描述性。
你的钥匙似乎都是字母。并且您的值都是数字 - 但它们被您不想要的引号字符包围。所以请尝试使用此正则表达式= /([a-z]+)\s*=\s*"(\d+)"/g
。
这给出了:
$VAR1 = {
'bcd' => '345',
'abc' => '123',
'ytr' => '434',
'xyz' => '4567'
};
对我而言看起来是正确的。