KGNickl
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!
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";
}
^\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]) }
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
if (/^([+-]?)(?=\d|\.\d)\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:
As for the explanation:
^\d+(?:\.\d+)?$
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
ASKER
m/^\d*\.\d+$/
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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.