Range extraction: Difference between revisions

Added Perl
(Added Haskell.)
(Added Perl)
Line 573:
Sample output:
<lang oz>0-2,4,6-8,11,12,14-25,27-33,35-39</lang>
 
=={{header|Perl}}==
 
Using only regexes. Also handles negative integer ranges.
 
<lang Perl>sub rangext {
(my $str = shift) =~ s/,\s+/ /g;
1 while $str =~ s{([+-]?\d+) ([+-]?\d+)}
{$1.(abs($2 - $1) == 1 ? '~' : ',').$2}eg;
$str =~ s/(\d+)~([+-]?\d+~)+([+-]?\d+)/$1-$3/g;
$str =~ s/~/,/g;
return $str;
}
 
# Test and display
$test = '0, 1, 2, 4, 6, 7, 8, 11, 12, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 27, 28, 29, 30, 31, 32, 33, 35, 36,
37, 38, 39';
print rangext($test), "\n";</lang>
 
Output:
<pre>0-2,4,6-8,11,12,14-25,27-33,35-39</pre>
 
=={{header|PicoLisp}}==
Anonymous user