正则表达式匹配,直到

时间:2015-03-11 16:58:58

标签: regex json

我有以下字符串:

{"name":"db-mysql","authenticate":false,"remove":false,"skip":false,"options":{"create":{"Image":"mysql:5.6/image-name:0.3.44","Env":{"MYSQL_ROOT_PASSWORD":"dummy_pass","MYSQL_DATABASE":"dev_db"}}}}

我需要获得版本:0.3.44

图案永远是"图像":" XXX:YYY / ZZZ:VVV"

非常感谢任何帮助

Rubular link

2 个答案:

答案 0 :(得分:2)

此正则表达式将可靠地匹配任何字符串中的给定“模式”并捕获指定为VVV的组:

/"Image":"[^:"]+:[^"\/]+\/[^":]+:([^"]+)"/

其中模式被理解为表达要匹配的输入的以下特征:

  • "Image"与以下"之间的冒号周围没有空格(虽然可以与小调整相匹配);
  • XXXZZZ子字符串确实包含任何冒号;
  • YYY子字符串不包含正斜杠(/);和
  • 无论是否转义,子字符串XXXYYYZZZVVV都不包含文字双引号(")。

由于这些约束强于JSON或YAML需要表达给定数据,因此使用真正的JSON / YAML解析器可能会更好。真正的解析器将处理不满足约束的语义等效输入,并且它将识别包含该模式的无效(在JSON或YAML意义上)输入。但是,如果你不关心这一点,那么正则表达式就能完成这项任务。

答案 1 :(得分:1)

使用正则表达式非常难以正确执行,并且需要能够递归的正则表达式引擎。我只是使用现有的JSON解析器而不是编写50行正则表达式。

$ perl -MJSON::PP -E'
   use open ":std", ":encoding(UTF-8)";
   my $json = <>;
   my $data = JSON::PP->new->decode($json);
   my $image = $data->{options}{create}{Image};
   my %versions = map { split(/:/, $_, 2) } split(/\//, $image);
   say $versions{"image-name"};
' my.json
0.3.44