如何匹配正则表达式中的事物列表?

Tim*_*mmy 1 regex perl

我正在解析一个文件,它的一部分是记录的东西,格式如下:

CategoryA--
5: UserA
6: UserB
7: UserC
CategoryB--
4: UserA
5: UserB
Run Code Online (Sandbox Code Playgroud)

我想将它移动到一个看起来像这样的哈希:

{ UserA => { CategoryA => 5, CategoryB => 4, }, 
  UserB => { CategoryA => 6, CategoryB => 5, },
  UserC => { CategoryA => 7, },
}
Run Code Online (Sandbox Code Playgroud)

我如何对此进行正则表达式?

编辑:它不一定纯粹只是正则表达式 - 只是在perl和循环也会很好.

Cha*_*ens 5

您需要两个正则表达式,一个用于标识新类别,另一个用于解析用户记录.

#!/usr/bin/perl

use strict;
use warnings;

my %users;
my $cur;
while (<DATA>) {
    if (my ($category) = /^(.*)--$/) {
        $cur = $category;
        next;
    }
    next unless my ($id, $user) = /([0-9]+): (\w+)/;
    die "no category found" unless defined $cur;
    $users{$user}{$cur} = $id;
}

use Data::Dumper;
print Dumper \%users;

__DATA__
CategoryA--
5: UserA
6: UserB
7: UserC
CategoryB--
4: UserA
5: UserB
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用Perl 5.10或更高版本,则可以将命名捕获与一个正则表达式一起使用:

#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

my %users;
my $cur;
while (<DATA>) {
    next unless /^(?:(?<category>.*)--|(?<id>[0-9]+): (?<user>\w+))$/;
    if (exists $+{category}) {
        $cur = $+{category};
        next;
    }
    die "no category found" unless defined $cur;
    $users{$+{user}}{$cur} = $+{id};
}

use Data::Dumper;
print Dumper \%users;

__DATA__
CategoryA--
5: UserA
6: UserB
7: UserC
CategoryB--
4: UserA
5: UserB
Run Code Online (Sandbox Code Playgroud)