有没有办法匹配字符串:数字在字符串中的位置?

时间:2019-03-25 12:51:26

标签: regex sitescope

我们正在使用简单的curl来通过API获取指标。问题在于,输出固定在参数数量上,而不是固定在输出中的位置。

我们需要使用“简单”的正则表达式来执行此操作,因为该工具仅接受此操作。

/"name":"(.*)".*?"memory":(\d+).*?"consumer_utilisation":(\w+|\d+).*?"messages_unacknowledged":(\d+).*?"messages_ready":(\d+).*?"messages":(\d+)/s

它适用于:

{"name":"queue1","memory":89048,"consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"messages":0}

但是,如果更改了输出顺序,则不再匹配:

{"name":"queue2","consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"messages":0,"memory":21944}
{"name":"queue3","consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"memory":21944,"messages":0}

我需要一个相对的字符串定义来匹配,因为我不知道它们会出现在哪个位置。它总共有9个不同的队列指标组。

1 个答案:

答案 0 :(得分:0)

简单的选择是对每个键值对使用一个正则表达式,而不是一个大的正则表达式。

/"name":"((?:[^\\"]|\\.)*)"/
/"memory":(\d+)/

此其他选项不是正则表达式,但可能就足够了。除了使用正则表达式外,您还可以在读取结果前先对其进行转换。因为您说的是“我们正在使用简单的卷曲” ,所以我猜您在谈论的是Curl命令行工具。您可以将结果传递到简单的Perl命令中

perl -ne 'use JSON; use Text::CSV qw(csv); $hash = decode_json $_; csv (sep_char=> ";", out => *STDOUT, in => [[$hash->{name}, $hash->{memory}, $hash->{consumer_utilisation}, $hash->{messages_unacknowledged}, $hash->{messages_ready}, $hash->{messages}]]);'

这将保持顺序不变,从而使使用正则表达式读取数据更加容易。

输入

{"name":"queue1","memory":89048,"consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"messages":0}
{"name":"queue2","consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"messages":0,"memory":21944}
{"name":"queue3","consumer_utilisation":null,"messages_unacknowledged":0,"messages_ready":0,"memory":21944,"messages":0}

输出

queue1;89048;;0;0;0
queue2;21944;;0;0;0
queue3;21944;;0;0;0

为此,您需要Perl并安装JSON和Text :: CSV软件包。在我的系统上,它们分别位于perllibjson-perllibtext-csv-perl中。

  

注意:我目前正在使用;作为分隔符。如果其中之一包含在输出中,则将双引号引起来。 "name":"que;ue1" => "que;ue1";89048;;0;0;0如果该值同时包含;",则"将通过在其前面放置另一个来转义。 "name":"q\"ue;ue1" => "q""ue;ue1";89048;;0;0;0