извлечь подстроку из строки в Perl - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть строка, подобная приведенной ниже:

downCircuit received;TOKENS START;{"action":'"UPDATE","device_id":"CP0027829","link_index":"101","name":"uplink101","description":"link1-0/0/3","priority":"200","status":"DOWN","wan_status":"DOWN","vlan":"4094","vlan_description":"vlan4094-intf","topic":"uplinks","stream_timestamp":"1547015547","aws_host":"attwifi-poc-central.arubathena.com","aws_timestamp":"1547015547","customer_id":"6666778917"};TOKENS END

Я хотел извлечь из нее значение link_index.т.е. выход должен быть 101 в этом случае.Может кто-нибудь помочь, пожалуйста, о том, как извлечь 101 из моей строки.

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

вы можете использовать обратную ссылку:

print $1,"\n" if /"link_index":"(\d+)"/

в полном контексте:

$string=q(downCircuit received;TOKENS START;{"action":'"UPDATE","device_id":"CP0027829","link_index":"101","name":"uplink101","description":"link1-0/0/3","priority":"200","status":"DOWN","wan_status":"DOWN","vlan":"4094","vlan_description":"vlan4094-intf","topic":"uplinks","stream_timestamp":"1547015547","aws_host":"attwifi-poc-central.arubathena.com","aws_timestamp":"1547015547","customer_id":"6666778917"};TOKENS END);
print $1,"\n" if $string =~ /"link_index":"(\d+)"/;
0 голосов
/ 01 февраля 2019

У меня есть строка, подобная приведенной ниже

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

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use JSON;

my $input = 'downCircuit received;TOKENS START;{"action":"UPDATE","device_id":"CP0027829","link_index":"101","name":"uplink101","description":"link1-0/0/3","priority":"200","status":"DOWN","wan_status":"DOWN","vlan":"4094","vlan_description":"vlan4094-intf","topic":"uplinks","stream_timestamp":"1547015547","aws_host":"attwifi-poc-central.arubathena.com","aws_timestamp":"1547015547","customer_id":"6666778917"};TOKENS END';

$input =~ s/.*START;//;
$input =~ s/;TOKENS END//;

my $data = JSON->new->decode($input);

say $data->{link_index};

Как и ожидалось, получится вывод 101.

Примечание: Я думаю, что в вашем вопросе есть опечатка.По крайней мере, в JSON есть синтаксическая ошибка.Я удалил один непревзойденный символ кавычки, который у вас был до "UPDATE".

0 голосов
/ 01 февраля 2019

Вы можете использовать простое регулярное выражение, подобное этому:

"link_index":"(\d+)"

И затем получить содержимое из группы захвата

Рабочая демонстрация

my $str = 'downCircuit received;TOKENS START;{"action":\'"UPDATE","device_id":"CP0027829","link_index":"101","name":"uplink101","description":"link1-0/0/3","priority":"200","status":"DOWN","wan_status":"DOWN","vlan":"4094","vlan_description":"vlan4094-intf","topic":"uplinks","stream_timestamp":"1547015547","aws_host":"attwifi-poc-central.arubathena.com","aws_timestamp":"1547015547","customer_id":"6666778917"};TOKENS END';
my $regex = qr/"link_index":"(\d+)"/mp;

if ( $str =~ /$regex/g ) {
  print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
  print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
  # print "Capture Group 2 is $2 ... and so on\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...