将字符串解析为哈希

Bor*_*der 4 regex perl parsing

我有一个字符串:

<https://gitlab.me.com/api/v3/projects/all?page=2&per_page=5>;
rel="next",
<https://gitlab.me.com/api/v3/projects/all?page=1&per_page=5>;
rel="first",
<https://gitlab.me.com/api/v3/projects/all?page=8&per_page=5>;
rel="last"
Run Code Online (Sandbox Code Playgroud)

所以格式是

(<val>; rel="key")*
Run Code Online (Sandbox Code Playgroud)

我想用以下格式将其解析为哈希:

next => https://gitlab.me.com/api/v3/projects/all?page=2&per_page=5
first => https://gitlab.me.com/api/v3/projects/all?page=1&per_page=5
last => https://gitlab.me.com/api/v3/projects/all?page=8&per_page=5
Run Code Online (Sandbox Code Playgroud)

在Java中,我将使用正则表达式模式来提取每个key => value对并​​将它们放入映射中.模式将是这样的:

<([^>]++)>;\s*rel="([^"]++)"
Run Code Online (Sandbox Code Playgroud)

哪个会给我第二个匹配组中的键和第一个匹配组中的值.同样的方法是实现这一目标的最好方法是Perl,还是我能做些什么?

PS我之所以使用Perl而不是Java的原因是服务器没有Java.

Bor*_*din 6

我的第一个倾向是将字符串拆分为逗号并使用三个子字符串,但最好在while循环中使用全局匹配 .

这应该做你想要的.(Perl是迄今为止更好的文本处理工具!)

更新我刚刚意识到你选择markdown会丢弃尖括号和换行符.这更合适吗?我认为这是一个多行字符串?

use strict;
use warnings;

my $str = <<'END';
<https://gitlab.me.com/api/v3/projects/all?page=2&per_page=5>;
rel="next",
<https://gitlab.me.com/api/v3/projects/all?page=1&per_page=5>;
rel="first",
<https://gitlab.me.com/api/v3/projects/all?page=8&per_page=5>;
rel="last"
END

my %data;
while ($str =~ / < ([^<>]+) >; \s* rel="([^"]+)" (?:,\s*)? /xg) {
  $data{$2} = $1;
}

use Data::Dump;
dd \%data;
Run Code Online (Sandbox Code Playgroud)

产量

{
  first => "https://gitlab.me.com/api/v3/projects/all?page=1&per_page=5",
  last  => "https://gitlab.me.com/api/v3/projects/all?page=8&per_page=5",
  next  => "https://gitlab.me.com/api/v3/projects/all?page=2&per_page=5",
}
Run Code Online (Sandbox Code Playgroud)