/ / RegEx pre oba, celé a float - regex

RegEx pre oba, celé číslo a float - regex

Potrebujem regex, aby sa zhodoval ako s celočíselnými hodnotami, tak aj s číslami float (zatiaľ čo čísla float majú "." Ako oddeľovač). Tieto čísla sú vždy v zátvorke a môžu mať vedúci znak "+".

Čo by malo byť platné:

  • (1.0)
  • (1)
  • (9.9)
  • (10000000)
  • (15)

Čo by malo byť neplatné:

  • 1.0 --- pretože žiadna zátvorka
  • 5 --- pretože žiadna zátvorka
  • (1,5) --- becaue "," namiesto "."
  • (a) --- pretože nie je číslo
  • (1 5) --- kvôli nielen jednému číslu
  • (1 + 5) --- pretože ... dobre ... jednoducho chýba vzor
  • [5] - pretože nesprávne zátvorky

odpovede:

17 pre odpoveď č. 1

To by malo fungovať na väčšine perl ako regex motory:

/(d+(.d+)?)/

10 pre odpoveď č. 2

Bohužiaľ, momentálne prijatá odpoveď je chybná (bude sa zhodovať s "1a5", ale nebude mať "match" .5 ") .Tak som sa rozhodol napísať svoj vlastný Regex, rovnako ako lacný Perl skript, aby som otestoval.

požiadavky

Regex sa bude zhodovať s celým číslom alebo floatom s predchádzajúcim znakom +/-. Nezaujíma sa o záznam E, preto som to ignoroval.
nhahtdh spomenul "(5.) a (.6)": "5."nevyzerá správne na mňa, koncové obdobie nemá žiadny účel, avšak" .6 "je skutočne platné, pretože vedúce obdobie naznačuje pozitívnu hodnotu <1 (to znamená, že je krátke pre" 0,6 ").
Počiatočný (?=.) je zabezpečiť, aby sa prázdny reťazec nezhodol.
Ako bonus som použil vnorené skupiny, aby ste mohli ľahko extrahovať rôzne časti čísla:

  • $ 1 = celé číslo
  • $ 2 = Celá časť
  • $ 3 = zlomková časť s vedúcim obdobím
  • $ 4 = zlomková časť

regex

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

skúška

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

Dajte mi vedieť, či je niečo, čo som prehliadol.

pridanie

Vynucovanie zátvoriek je triviálne, stačí zabaliť celú vec v zátvorkách ESCAPED:

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