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ď č. 1To 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]+))?))$