http://www.perlmonks.org?node_id=11133089


in reply to Re: Regexp substitution on variable-length ranges with embedded code?
in thread Regexp substitution on variable-length ranges with embedded code?

This also works very nicely. Very nice one-liner. Now I'm wondering if the last two could be joined with a comma in the same operation to yield:

43:1:1-6; 27:3:7-9; 65:1:4,18

I hadn't really considered such possible, but you experts make me think I may have underestimated.

Blessings,

~Polyglot~

  • Comment on Re^2: Regexp substitution on variable-length ranges with embedded code?
  • Download Code

Replies are listed 'Best First'.
Re^3: Regexp substitution on variable-length ranges with embedded code?
by tybalt89 (Monsignor) on May 26, 2021 at 21:25 UTC

    Simple with a second line. You don't really need it in one line, do you?

    #!/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
Re^3: Regexp substitution on variable-length ranges with embedded code?
by The Perlman (Scribe) on May 27, 2021 at 11:27 UTC
    One regex for both would be very complicated. But two regexes almost trivial now.

    First regex should transform in comma separated list: 65:1:2,3,4,18

    Second regex should apply shown technique to condense lists to ranges: 65:1:2-4,18

    - Ron