Perl解析带有一个或多个字段的字符串

Jon*_*han 4 regex perl

我有一个我需要解析的字符串.它符合以下要求:

  • 它由0个或更多键 - >值对组成.
  • 钥匙总是2个字母.
  • 值是一个或多个数字.
  • 键和值之间不会有空格.
  • 各对之间可能存在也可能不存在空格.

我可能会看到示例字符串:

  • AB1234 //一键 - >值对(键= AB,值= 1234)
  • AB1234 BC2345 //两个键 - >值对,用空格分隔
  • AB1234BC2345 //两个键 - >值对,不用空格分隔
  • //空Sting,无键 - >值对
  • AB12345601BC1234CD1232PE2343 //很多键 - >值对,没有空格
  • AB12345601 BC1234 CD1232 PE2343 //许多key->值对,带空格

我需要构建一个这个字符串的Perl哈希.如果我能保证它是1对我会做这样的事情:

$string =~ /([A-Z][A-Z])([0-9]+)/
$key = $1
$value = $2
$hash{$key} = $value
Run Code Online (Sandbox Code Playgroud)

对于多个字符串,我可以做一些事情,在上述正则表达式的每次匹配之后,我获取原始字符串的子字符串(免除第一个匹配)然后再次搜索.但是,我确信有一种更聪明的,perl-esque方式来实现这一目标.

希望我没有这么糟糕的数据来源来处理 -

乔纳森

out*_*tis 8

在具有全局标志的列表上下文中,正则表达式将返回所有匹配的子字符串:

use Data::Dumper;

@strs = (
    'AB1234',
    'AB1234 BC2345',
    'AB1234BC2345',
    '',
    'AB12345601BC1234CD1232PE2343',
    'AB12345601 BC1234 CD1232 PE2343'
);

for $str (@strs) {
    # The money line
    %parts = ($str =~ /([A-Z][A-Z])(\d+)/g);

    print Dumper(\%parts);
}
Run Code Online (Sandbox Code Playgroud)

要获得更高的不透明度,请删除模式匹配周围的括号:%parts = $str =~ /([A-Z][A-Z])(\d+)/g;.