RegEx for both, integer and float

I need a regular expression to match both integer values ​​and floating point numbers (whereas floating point numbers have a "." As a delimiter). These numbers are always in brackets and may have a leading β€œ+”.

What should be true:

  • (1.0)
  • (one)
  • (9.9)
  • (10,000,000)
  • (+ 15)

What should be invalid:

  • 1.0 --- because there is no bracket
  • 5 --- because there is no bracket
  • (1,5) --- becaue "," instead of "."
  • (a) --- due to not a number
  • (1 5) --- due to not only one number
  • (1 + 5) --- because ... well ... just a template crash
  • [5] --- because the brackets are wrong
+7
source share
2 answers

This should work on most Perl regex engines:

/(\d+(\.\d+)?)/ 
+14
source

Unfortunately, the currently accepted answer is erroneous (it will match "1a5", but it will not match ".5"). So I decided to write my own Regex, as well as a cheap Perl script, to test it.

Requirements

Regex will match an integer or float with the previous + / sign. I'm not interested in the notation E, so I ignored it.
nhahtdh mentions "(5.) and (.6)": "5." doesn't look right to me, the end period has no purpose. However, β€œ.6” is indeed valid, since the lead period indicates a positive value <1 (ie, Reduces to β€œ0.6”).
The initial (?=.) Should make sure that the empty string will not match.
As a bonus, I used nested groups, so you can easily extract different parts of the number:

  • $ 1 = integer
  • $ 2 = Integer part
  • $ 3 = Fractional part with leading period
  • $ 4 = Fractional

Regex

 ^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$ 

Test

 $ perl -e 'use strict; use warnings; my $a = "1.0"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' MATCH Float:<1.0> Integer:<1> Fraction:<0> $ perl -e 'use strict; use warnings; my $a = "1"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' MATCH Float:<1> Integer:<1> No fraction $ perl -e 'use strict; use warnings; my $a = "9.9"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' MATCH Float:<9.9> Integer:<9> Fraction:<9> $ perl -e 'use strict; use warnings; my $a = "10000000"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' MATCH Float:<10000000> Integer:<10000000> No fraction $ perl -e 'use strict; use warnings; my $a = "+15"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' MATCH Float:<+15> Integer:<15> No fraction $ perl -e 'use strict; use warnings; my $a = "1,5"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' NO MATCH $ perl -e 'use strict; use warnings; my $a = "a"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' NO MATCH $ perl -e 'use strict; use warnings; my $a = "1 5"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' NO MATCH $ perl -e 'use strict; use warnings; my $a = "1+5"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' NO MATCH $ perl -e 'use strict; use warnings; my $a = "5."; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' NO MATCH $ perl -e 'use strict; use warnings; my $a = ".6"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' MATCH Float:<.6> Integer:<> Fraction:<6> $ perl -e 'use strict; use warnings; my $a = ".5"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' MATCH Float:<.5> Integer:<> Fraction:<5> $ perl -e 'use strict; use warnings; my $a = "1a5"; if ($a =~ /^(?=.)([+-]?([0-9]*)(\.([0-9]+))?)$/) { print "MATCH\nFloat:<$1>\n"; print defined $2 ? "Integer:<$2>\n" : "No integer\n"; print defined $4 ? "Fraction:<$4>\n" : "No fraction\n"; } else { print "NO MATCH\n"; }' NO MATCH 

Please let me know if there is something that I missed.

Adding

Forced braces are trivial, just wrap it all in ESCAPED brackets:

 ^\((?=.)([+-]?([0-9]*)(\.([0-9]+))?)\)$ 
+9
source

All Articles