#!/usr/bin/env perl # # Original JavaScript source and explanation by Asen Bozhilov: # http://groups.google.com/group/comp.lang.javascript/msg/32b57c81c2cb9c59 # use strict; use warnings; sub toRange { my $num = shift; my @arr = (); my $LN10 = log(10); while ($num > 0) { my $n = $num; my $size = int(log($num) / $LN10); my $j = $size; my $i = 10; my $reg = ""; my $digit; while (($digit = $n % 10) == 9) { if ($i < $num) { $reg .= "[0-9]"; } else { $reg = "[1-9]" . $reg; } $n = int($n / 10); $i *= 10; $j--; } if ($j > 0) { $reg = substr($num, 0, $j) . ($digit ? "[0-$digit]" : "0") . $reg; } elsif ($digit) { $reg = ($digit > 1 ? "[1-$digit]" : "1") . $reg; } if ($i >= $num) { $num = 10 ** $size - 1; } else { $num -= ($num % $i) + 1; } push @arr, $reg; } push @arr, 0; return "(?:" . join("|", @arr) . ")"; } ## examples: print toRange(255), "\n"; # (?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9]|0) print toRange(26), "\n"; # (?:2[0-6]|1[0-9]|[1-9]|0)