Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6283[/thread]

RegEx: nur Zahlen

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
pktm
 2004-05-22 19:10
#82638 #82638
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!

Wie sieht eine Regex aus, die wahr liefert, wenn ein Scalar nur Zahlen enthält?

mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
steve
 2004-05-22 19:12
#82639 #82639
User since
2004-03-04
52 Artikel
BenutzerIn
[default_avatar]
/\d+/

somit wären das nur Zahlen. Ich bin mir aber nicht sicher, ob du das weißt!

steve
pktm
 2004-05-22 19:16
#82640 #82640
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Komisch, hatte das eben probiert und es ging nicht :rock:
EDIT: also jetzt geht es komischerweise
Quote
Ich bin mir aber nicht sicher, ob du das weißt!

;)\n\n

<!--EDIT|pktm|1085239065-->
http://www.intergastro-service.de (mein erstes CMS :) )
Taulmarill
 2004-05-22 19:21
#82641 #82641
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
hm, nicht ganz.
/\d+/ liefert wahr, wenn der zu prüfende string unter anderem eine oder mehr ziffern enthält.
wenn man sicher stellen will, dass sich ausschliesslich ziffern in einem string befinden muss das so aussehen
/^\d+$/
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
steve
 2004-05-22 20:02
#82642 #82642
User since
2004-03-04
52 Artikel
BenutzerIn
[default_avatar]
@ Taulmarill

hast natürlich recht :D
Gast Gast
 2004-05-22 21:51
#82643 #82643
$var !~ /\D/;
liefert 'True' wenn $var nur numerische Werte enthält.
$var =~ /\D/;
Liefert 'True' wenn $var einen (oder mehrere) nicht numerischen Wert enthält.
jan
 2004-05-23 00:42
#82644 #82644
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn man nur auf ziffern prüft und nicht auf komma und punkt(e), dann könnte man auch int($var) mit $var vergleichen, wenn die eq sind, sind's nur zahlen.
aber der regexp ist offensichtlich schneller...
Code: (dl )
1
2
3
4
5
6
7
8
9
10
C:\Dokumente und Einstellungen\jan>perl
use Benchmark qw/:all/;
timethese(10000000, {
'regexp' => sub { my $var = '1555000000'; my $onlydigits = 1 if($var =~ m/^\d$/);},
'inttest' => sub { my $var = '1555000000'; my $onlydigits = 1 if(int($var) eq $var);},
});
^Z
Benchmark: timing 10000000 iterations of inttest, regexp...
inttest: 19 wallclock secs (17.57 usr + 0.01 sys = 17.58 CPU) @ 568957.67/s (n=10000000)
regexp: 8 wallclock secs ( 6.84 usr + 0.03 sys = 6.87 CPU) @ 1455604.08/s (n=10000000)
Dubu
 2004-05-23 22:02
#82645 #82645
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=jan,22.05.2004, 22:42]
aber der regexp ist offensichtlich schneller...
[/quote]
Aber nur, so lange deine Regex auf nur eine einzelne Ziffer prueft. Das Ergebnis kehrt sich um, wenn wirklich auf Zahlen (d.h. mehrere Ziffern hintereinander) getestet wird.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
~/perl/test> cat nurzahlen.pl
#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw/cmpthese/;

cmpthese(-5, {
   regexpZiffer => sub { my $var = '1555000000'; my $onlydigits = 1 if($var =~ m/^\d$/);},
   regexpStern  => sub { my $var = '1555000000'; my $onlydigits = 1 if($var =~ m/^\d*$/);},
   regexpPlus   => sub { my $var = '1555000000'; my $onlydigits = 1 if($var =~ m/^\d+$/);},
   regexpInv    => sub { my $var = '1555000000'; my $onlydigits = 1 unless ($var =~ m/\D/);},
   inttest      => sub { my $var = '1555000000'; my $onlydigits = 1 if(int($var) eq $var);},
});

~/perl/test> ./nurzahlen.pl
                 Rate regexpStern regexpPlus    inttest  regexpInv regexpZiffer
regexpStern  1049899/s          --        -2%        -4%       -28%         -37%
regexpPlus   1069469/s          2%         --        -2%       -27%         -36%
inttest      1096502/s          4%         3%         --       -25%         -35%
regexpInv    1459240/s         39%        36%        33%         --         -13%
regexpZiffer 1678905/s         60%        57%        53%        15%           --

Der schnellste Test (nach dem auf einzelne Ziffern) ist also der auf eine Nicht-Ziffer, gefolgt vom Vergleich mit int().
Letzterer hat aber einen anderen Nachteil: Er funktioniert nicht, wenn die Ziffernfolge mit einer Null anfaengt.
Strat
 2004-05-24 01:38
#82646 #82646
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
diese Regexen sind alle wunderschoen, aber einfacher und fehlerfreier geht's normalerweise mit CPAN:Regexp::Common
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2004-05-24 17:37
#82647 #82647
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
[quote=Dieter,22.05.2004, 19:51]$var !~ /\D/;
liefert 'True' wenn $var nur numerische Werte enthält.
$var =~ /\D/;
Liefert 'True' wenn $var einen (oder mehrere) nicht numerischen Wert enthält.[/quote]
nö, -3.14 ist auch ein numerischer Wert ;)

Für soetwas immer lieber die vordefinierten Regeln verwenden (-> Strat).
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-05-22 19:10.