in reply to RegEx to match unique string of digits

Easier to find all the 10 or more digit numbers, then drop out the special case:

use strict; use warnings; my $str = '2222222222 1234567890 0000000000 48192049281924 99999999999 +999'; my @matched = grep {! /^(\d)\1{9,}$/} $str =~ /\b(\d{10,})\b/g; print "@matched";

Prints:

1234567890 48192049281924

Update: Ok, here's a regex that does the trick. Let me know which you think more readable and maintainable. ;)

use strict; use warnings; my $str = '2222222222 1234567890 0000000000 48192049281924 99999999999 +999'; my @matched = $str =~ / [^\d]* (?:\b(?: 0{10,} | 1{10,} | 2{10,} | 3{10,} | 4{10,} | 5{10,} | 6{10,} | 7{10,} | 8{10,} | 9{10,})\b [^\d]* )* (\b\d{10,}\b) (?:[^\d]* \b(?: 0{10,} | 1{10,} | 2{10,} | 3{10,} | 4{10,} | 5{10, +} | 6{10,} | 7{10,} | 8{10,} | 9{10,})\b )* /gx; print "@matched";

True laziness is hard work

Replies are listed 'Best First'.
Re^2: RegEx to match unique string of digits
by JavaFan (Canon) on Jun 05, 2009 at 08:03 UTC
    That regexp isn't going to work. Running it against a string of 10 identical numbers, it will match those 10 numbers.
    my $str = '0000000000'; my @matched = $str =~ / [^\d]* (?:\b(?: 0{10,} | 1{10,} | 2{10,} | 3{10,} | 4{10,} | 5{10,} | 6{10,} | 7{10,} | 8{10,} | 9{10,})\b [^\d]* )* (\b\d{10,}\b) (?:[^\d]* \b(?: 0{10,} | 1{10,} | 2{10,} | 3{10,} | 4{10,} | 5{10, +} | 6{10,} | 7{10,} | 8{10,} | 9{10,})\b )* /gx; say "@matched"; __END__ 0000000000

    The problem with your regexp is is that skipping sequences of 10 identical digits is optional. And that the heart, the (\b\d{10,}\b) part, isn't restrictive. And that Perl will do its utter best to find a match somehow, somewhere.