我有以下字符串:
{"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"
非常感谢任何帮助
答案 0 :(得分:2)
此正则表达式将可靠地匹配任何字符串中的给定“模式”并捕获指定为VVV
的组:
/"Image":"[^:"]+:[^"\/]+\/[^":]+:([^"]+)"/
其中模式被理解为表达要匹配的输入的以下特征:
"Image"
与以下"
之间的冒号周围没有空格(虽然可以与小调整相匹配); XXX
和ZZZ
子字符串确实包含任何冒号; YYY
子字符串不包含正斜杠(/
);和XXX
,YYY
,ZZZ
或VVV
都不包含文字双引号("
)。 由于这些约束强于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