in reply to Matching floats according to perlfaq4

/^[+-]?(?=\d|\.)\d*\.?\d*(?:[eE][+-]?\d+)?$/

Update: Fixed to avoid matching "+."

/^[+-]?(?=\.?\d)\d*\.?\d*(?:[eE][+-]?\d+)?$/

Update: My test code with additional cases.

#!/usr/bin/perl -w use strict; my @good = qw( 0e0 0 +0 -0 1. 0.14 .14 1.24e5 24e5 -24e-5); my @bad = ('', qw(. +. 1e e1 2.3. 2.3.4 1..2 .1.1 e.1 e1.1 .1a 1.a 1.1a 1a +.1 1.a1)); my $pat = qr/^[+-]?(?=\.?\d)\d*\.?\d*(?:[eE][+-]?\d+)?$/; print "GOOD Tests (Should match.)\n"; print /$pat/ ? ' ': 'no ', "match: '$_'\n" for @good; print "\nBAD Tests (Should not match.)\n"; print /$pat/ ? ' ': 'no ', "match: '$_'\n" for @bad;

Update: This can be made even shorter than the solution posted by an Anonymous Monk if you change it to use capturing parens and the /i modifier instead of the [Ee] character class as he does in his.

/^[+-]?(?=\.?\d)\d*\.?\d*(e[+-]?\d+)?$/i

In response to and agreement with demerphq's reply, I don't actually recommend this last one at all. I just wanted to show that it could be golfed further.

-sauoq
"My two cents aren't worth a dime.";

Replies are listed 'Best First'.
Re: (Regex Golf) Re: Matching floats according to perlfaq4
by demerphq (Chancellor) on Sep 27, 2002 at 11:49 UTC
    I like your modification of the FAQ version, but id prefer to write it as
    /^[+-]?(?=\.?\d)\d*(?:\.\d*)?(?:[Ee][+-]?\d+)?$/
    As it makes more sense to me and I dont like the /i modifier. (Also I dont see any reason to capture the last block if you arent going to capture the others... :-)

    Although im aware you were trying to make the regex shorter... Personally I wouldn't.

    --- demerphq
    my friends call me, usually because I'm late....

      Thanks. To be clear, I prefer that one too. I wasn't even trying to make a shorter version, just a simpler version.

      The only reason I put that one up was because I had already prefixed "(Regex Golf)" to the node after I noticed mine was shorter than the ones in the OP but then later realized that the Anonymonk's was shorter than mine due to his ugly little tricks. So, in a moment of poor judgement, I showed that I could use those ugly little tricks too. :-)

      -sauoq
      "My two cents aren't worth a dime.";