我刚开始学习Perl并尝试使用正则表达式来分解令牌密钥。
令牌本身有多个"列"我只需要KEY部分。
token:
{
"token_key":"C9B3A703ADFEE7A579561799DC019685C75F16E6D4F80E3AA01798CA2B1BD4C396E91C62D73A9604EE90C72BED760AC24D70B072517B06C3D2E1E3102046103E813E2AA59741D2B6543475DEED4EF4A9625BFFF15DAC5417209AEED968016E0671BE1878C8",
"key_type":"xyz",
"expires":1200
}
但我只需要这部分
C9B3A703ADFEE7A579561799DC019685C75F16E6D4F80E3AA01798CA2B1BD4C396E91C62D73A9604EE90C72BED760AC24D70B072517B06C3D2E1E3102046103E813E2AA59741D2B6543475DEED4EF4A9625BFFF15DAC5417209AEED968016E0671BE1878C8
输出时可以忽略其他所有内容。
欢迎任何建议或建议!
谢谢!
答案 0 :(得分:4)
这看起来像JSON
- 也许正确的解析器会更好?
use JSON::PP;
my $json = JSON::PP->new->utf8->allow_barekey;
my $token = $json->decode('{' . $str . '}')->{'token'};
print $token->{'token_key'};
在任何情况下,您都可以使用正则表达式提取它(更加笨拙):
$str =~ /['"]token_key['"]:\s*['"]([a-f0-9]+)['"]/i;
print $1;
答案 1 :(得分:0)
一个稍微不那么强硬的正则表达式会是:
# (["'])\s*token_key\s*\1\s*:\s*(["'])((?:(?!\2)[\S\s])*)\2
( ["'] ) # (1)
\s* token_key \s*
\1
\s* : \s*
( ["'] ) # (2)
( # (3 start)
(?:
(?! \2 )
[\S\s]
)*
) # (3 end)
\2
答案 2 :(得分:0)
假设如下:
在那种情况下
if (/"token_key":"([^"]+)/)
{ print "$1\n" }