Avatar billede webcreator Nybegynder
28. november 2005 - 18:38 Der er 17 kommentarer og
1 løsning

Digits og punktum

Hej Eksperter.

Hvordan ser et regulært udtryk ud der tillader tal og punktummer? Fx 123.43 eller 12343 eller 32.654645.
Avatar billede webcreator Nybegynder
28. november 2005 - 18:39 #1
(Udtrykket må KUN indeholde tal og punktummer - men punktum er optionalt. Kunne dog være smart hvis udtrykket ikke blev sandt hvis der kun var et punktum - dog ikke et krav)
Avatar billede Slettet bruger
28. november 2005 - 19:01 #2
Først den nemme:

/^[0-9.]*$/

Så den smarte (Skal indeholde cifre og må godt have et punktum, men ikke mere end et)

/^([0-9]+\.[0-9]+|\.[0-9]+|[0-9]+\.)$/
Avatar billede webcreator Nybegynder
28. november 2005 - 20:59 #3
Hej Sandbox.

Tak for hjælpen - men jeg kan nu ikke få det til at virke. Jeg benytter C# .NET til det :

Regex regex = new Regex(@"/([0-9]+\.[0-9]+|\.[0-9]+|[0-9]+\.)$/");

if (regex.Match("4278").Success)
    Console.WriteLine("Det er et tal");
else
    Console.WriteLine("Det er IKKE et tal");
Avatar billede webcreator Nybegynder
28. november 2005 - 21:01 #4
Derimod virker følgende ganske udemærket - til blot at tjekke om det er et tal:

Regex(@"\d");
Avatar billede Slettet bruger
28. november 2005 - 21:06 #5
Nu har jeg ikke lige benyttet regex fra C# - det har været noget af det næste jeg ville se på, lige siden jeg begyndte i skolen, hvor vi netop bliver undervist i at programmere C#.

En ting dog: Du mangler ^-tegnet i begyndelsen

Og jeg manglede et ?-tegn i slutningen.

Regex regex = new Regex(@"/^([0-9]+\.[0-9]+|\.[0-9]+|[0-9]+\.?)$/");
Avatar billede Slettet bruger
28. november 2005 - 21:10 #6
Men den kan jo kortes lidt ned så. Jeg var ikke klar over hvilke "genveje" der var understøttet i C#, for alle forkortelserne er nemlig ikke med i alle regexp-versioner.

Regex regex = new Regex(@"/^(\d+\.\d+|\.\d+|\d+\.?)$/");
Avatar billede Slettet bruger
28. november 2005 - 21:13 #7
Og den kan jo gøres kortere:

Regex regex = new Regex(@"/^(\d+\.?\d*|\.\d+)$/");
Avatar billede webcreator Nybegynder
28. november 2005 - 21:22 #8
Hm, det dutter stadig ikke. Og jeg har direkte kopieret koden fra din sidste post.
Avatar billede webcreator Nybegynder
28. november 2005 - 21:22 #9
Test-Data : 4.3237
Avatar billede Slettet bruger
28. november 2005 - 21:43 #10
OK, jeg har fundet fejlen. I C# må der ikke være // som start og slut på en regex, og det skal der være i andre udgaver. Hvis de bliver fjernet, virker det.

Jeg har afprøvet med:
1.234
234.1
12.34
1234
al23.4
1a23
123a
Avatar billede Slettet bruger
28. november 2005 - 21:44 #11
Og så var der et svar
Avatar billede webcreator Nybegynder
28. november 2005 - 21:48 #12
Super! Tusind tak! Rart at man kan få hjælp til det. Jeg har ikke haft overskud til at sætte mig ordentlig ind i RegEx - det er eksamenstid for mit vedkommende :)
Avatar billede Slettet bruger
28. november 2005 - 22:11 #13
Tjah, og nu fik jeg jo en undskyldning for endelig at sætte mig ind i hvordan de virker i C#, for der er altid små forskelle fra sprog til sprog:

I Perl er det ekstremt let at bruge en regex:
if ( "1234" =~ /^\d*$/ )
  echo "Det var kun tal";

I PHP er det lidt mere bøvlet:
if ( preg_match("/^\d*$/", "1234" )
  echo "Det var kun tal";

I C# er der en masse objekt-hurlumhej udenom.

NB Husk ^ og $ tegnet, for ellers ville du ikke fange sådan noget som a123, som også ville være blevet godkendt af den, du skrev 21:01:02. ^ betyder begyndelsen af en streng og $ betyder slutningen.

"\d" vil godkende enhver streng der bare indeholder mindst et ciffer.
"^\d$" vil godkende enhver streng, der indeholder netop et ciffer og intet andet.
"^\d+$" vil godkende en streng, der indeholder et eller flere cifre og intet andet.

Og det kan tit være en fordel at tænke bagvendt (i []  betyder en ^ som første tegn, at den matcher på alle andre tegn, end de nævnte):

"[^0-9]" vil godkende enhver streng, der indeholder et tegn, der ikke er et ciffer.
"[^0-9.]" vil godkende enhver streng, der indeholder andre tegn end cifre og punktum.

Den sidste vil dermed fejle dine gyldige strenge, og så kan man finde dem på den måde. Nu komplicerede jeg så opgaven lidt, for selv om du ikke havde sagt, at der kun måtte være et punktum, gik jeg ud fra det, og så dur den omvendte tankegang ikke mere.
Avatar billede webcreator Nybegynder
28. november 2005 - 22:28 #14
Mange tak - så blev jeg da så meget klogere. Tror ikke det vil være helt umuligt at sætte mig ind i det - når jeg får tid.
Tak igen! :)
Avatar billede roenving Novice
29. november 2005 - 12:14 #15
Ville det ikke være lettere med et enkelt udtryk:

Regex regex = new Regex(@"^\d+(\.\d+)?$");
Avatar billede Slettet bruger
29. november 2005 - 15:18 #16
Den vil ikke godkende 32. eller .32

Den kan let udvides til at godtage den første ved bare at ændre det andet + til en *, men hvis den skal godkende begge (og samtidig ikke godkende en streng med kun et punktum og ingen tal) er man nødt til at bruge (|)

Det er selvfølgelig muligt, at de to heller ikke skal godkendes, men det fremgik ikke af opgavebeskrivelsen - og folk har vel nærmest vænnet sig til at kommatal mellem 0 og 1 kan skrives uden det foranstillede nul.
Avatar billede roenving Novice
29. november 2005 - 15:22 #17
Tjah, hvis det skal være tilladt med et decimal-tal uden noget foran kan man bare ændre det første + til * !-)
Avatar billede Slettet bruger
29. november 2005 - 15:26 #18
Nej, for så vil den også godtage en tom streng. (Det ville mit første nemme forslag forresten også.)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB