Link to home
Start Free TrialLog in
Avatar of KGNickl
KGNicklFlag for United States of America

asked on

Perl Regular Expression?

I need to write a regular expression where the question marks are in the code code is below. The $var1 will be a value where only numbers and a period are ok.

Valid values would be:
1.0001
2.3
0.2

Invalid would be any letters, a comma, other characters, etc...
Only numbers and a period are valid.

Please post an answer and explanation of what it does. I'm terrible at regular expressions and in a hurry to finish some code, but still trying to learn them as I go! Thanks!  

if( $var1 ~= ???? ){
    print "true";
}else{
    print "false";
}

Open in new window

Avatar of Pratima
Pratima
Flag of India image

^\d+(\.\d)?$
perldoc -q "How do I determine whether a scalar is a number/whole/integer/float"
Found in perlfaq4.pod
       How do I determine whether a scalar is a number/whole/integer/float?

       Assuming that you don't care about IEEE notations like "NaN" or
       "Infinity", you probably just want to use a regular expression.

               if (/\D/)            { print "has nondigits\n" }
               if (/^\d+$/)         { print "is a whole number\n" }
               if (/^-?\d+$/)       { print "is an integer\n" }
               if (/^[+-]?\d+$/)    { print "is a +/- integer\n" }
               if (/^-?\d+\.?\d*$/) { print "is a real number\n" }
               if (/^-?(?:\d+(?:\.\d*)?|\.\d+)$/) { print "is a decimal number\n" }
               if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
                               { print "a C float\n" }

       There are also some commonly used modules for the task.  Scalar::Util
       (distributed with 5.8) provides access to perl's internal function
       "looks_like_number" for determining whether a variable looks like a
       number.  Data::Types exports functions that validate data types using
       both the above and other regular expressions. Thirdly, there is
       "Regexp::Common" which has regular expressions to match various types
       of numbers. Those three modules are available from the CPAN.

       If you're on a POSIX system, Perl supports the "POSIX::strtod"
       function.  Its semantics are somewhat cumbersome, so here's a "getnum"
       wrapper function for more convenient access.  This function takes a
       string and returns the number it found, or "undef" for input that isn't
       a C float.  The "is_numeric" function is a front end to "getnum" if you
       just want to say, "Is this a float?"

               sub getnum {
                       use POSIX qw(strtod);
                       my $str = shift;
                       $str =~ s/^\s+//;
                       $str =~ s/\s+$//;
                       $! = 0;
                       my($num, $unparsed) = strtod($str);
                       if (($str eq '') || ($unparsed != 0) || $!) {
                                       return undef;
                               }
                       else {
                               return $num;
                               }
                       }

               sub is_numeric { defined getnum($_[0]) }
pratima_mcs' solution is close, except that it won't handle your first sample:  1.0001. The correction is small though:

^\d+(?:\.\d+)?$

Open in new window


As for the explanation:
^          Beginning of string
\d+        One-or-more ( + ) of a digit ( \d )
(? ... )   Non-capturing group -- treat everything inside as one unit
\.         Literal period
\d+        One-or-more ( + ) of a digit ( \d )
?          Zero-or-one. Modifies the thing to the left, which in this case is the non-capturing group
$          End of string

Open in new window

Avatar of KGNickl

ASKER

m/^\d*\.\d+$/
ASKER CERTIFIED SOLUTION
Avatar of kaufmed
kaufmed
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of KGNickl

ASKER

Award kaufmed points. I didn't look at new answers after 11:00 this morning and then just closed it w/ adding my comments. So that answer is good and can be awarded points, just was after I already located the answer earlier in the morning.