Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: Regexp substitution on variable-length ranges with embedded code?

by tybalt89 (Monsignor)
on May 26, 2021 at 18:28 UTC ( [id://11133084]=note: print w/replies, xml ) Need Help??


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

#!/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; 27:3:7; 27:3:8; +27:3:9; 65:1:4; 65:1:18'; print "$_\n"; s/\b(\d+:\d+:)(\d+)\K(; \1((??{$+ + 1}))\b)+/-$+/g; print "$_\n";

Outputs:

43:1:1; 43:1:2; 43:1:3; 43:1:4; 43:1:5; 43:1:6; 27:3:7; 27:3:8; 27:3:9 +; 65:1:4; 65:1:18 43:1:1-6; 27:3:7-9; 65:1:4; 65:1:18

Replies are listed 'Best First'.
Re^2: Regexp substitution on variable-length ranges with embedded code?
by Polyglot (Chaplain) on May 26, 2021 at 20:25 UTC

    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~

      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
      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

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11133084]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others musing on the Monastery: (5)
As of 2024-04-20 01:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found