Perl正则表达式:从字符串中提取token_key值

时间:2014-05-30 18:57:46

标签: regex perl split

我刚开始学习Perl并尝试使用正则表达式来分解令牌密钥。

令牌本身有多个"列"我只需要KEY部分。

token:
{
    "token_key":"C9B3A703ADFEE7A579561799DC019685C75F16E6D4F80E3AA01798CA2B1BD4C396E91C62D73A9604EE90C72BED760AC24D70B072517B06C3D2E1E3102046103E813E2AA59741D2B6543475DEED4EF4A9625BFFF15DAC5417209AEED968016E0671BE1878C8",
    "key_type":"xyz",
    "expires":1200
}

但我只需要这部分

C9B3A703ADFEE7A579561799DC019685C75F16E6D4F80E3AA01798CA2B1BD4C396E91C62D73A9604EE90C72BED760AC24D70B072517B06C3D2E1E3102046103E813E2AA59741D2B6543475DEED4EF4A9625BFFF15DAC5417209AEED968016E0671BE1878C8

输出时可以忽略其他所有内容。

欢迎任何建议或建议!

谢谢!

3 个答案:

答案 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)

假设如下:

  1. " token_key"之间没有白色字符及其价值,
  2. 双引号,而不是单引号已在解析后的字符串中使用,
  3. 一个文件字符串在$ _ variable。
  4. 在那种情况下

        if (/"token_key":"([^"]+)/)
        { print "$1\n" }