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.
我的第一个倾向是将字符串拆分为逗号并使用三个子字符串,但最好在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)