#!/usr/bin/perl
use strict; # https://perlmonks.org/?node_id=11133054
use warnings;
$_ = '43:1:1; 43:1:2; 43:1:3; 43:1:4; 43:1:5; 43:1:6; 43:1:9; 43:1:10;
+ 27:3:2; 27:3:7; 27:3:8; 27:3:9; 65:1:4; 65:1:18; 65:1:28';
print "$_\n";
s/\b(\d+:\d+:)(\d+)\K(; \1((??{$+ + 1}))\b)+/-$+/g;
1 while s/\b(\d+:\d+:)[\d,-]+\K; \1([\d,-]+)/,$2/;
print "$_\n";
Outputs:
43:1:1; 43:1:2; 43:1:3; 43:1:4; 43:1:5; 43:1:6; 43:1:9; 43:1:10; 27:3:
+2; 27:3:7; 27:3:8; 27:3:9; 65:1:4; 65:1:18; 65:1:28
43:1:1-6,9-10; 27:3:2,7-9; 65:1:4,18,28
|