Есть ли способ сопоставления строк: числа с переменным позиционированием в строке? - PullRequest
2 голосов
/ 25 марта 2019

Мы используем простой завиток для получения метрик через 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 голосов
/ 25 марта 2019

Простой вариант - использовать регулярное выражение для каждой пары ключ-значение вместо одного большого регулярного выражения.

/"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}]]);'

Это позволит сохранить порядок, упрощая использование регулярных выражений для считывания данных.

input

{"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}

output

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

Для этого вам понадобится Perl и пакеты JSON и Text ::CSV установлен.В моей системе они присутствуют в perl, libjson-perl и libtext-csv-perl.

Примечание: В настоящее время я использую ; в качестве разделителя.Если это входит в один из выходных будет заключен в двойные кавычки."name":"que;ue1" => "que;ue1";89048;;0;0;0 Если значение включает в себя как ;, так и ", то " будет экранирован путем размещения еще одного перед ним."name":"q\"ue;ue1" => "q""ue;ue1";89048;;0;0;0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...