Avatar billede kongfjong Nybegynder
28. februar 2009 - 16:35 Der er 9 kommentarer og
1 løsning

Streng der indeholder minimum 15 bogstaver/tal

Hej

Jeg har brug for et regex der kan tjekke at en streng indeholder 15 tegn (dette inkludere store/små bogstaver, tal, specielttegn som punktum, komma, kolon). Strengen må også gerne indeholde \n, \t og \r samt mellemrum, altså \s i det hele taget.

Jeg kan simpelthen ikke lige se, hvordan jeg kan lave et sådan regex. Det eneste jeg kan få til at matche er et ord der matcher 15 tegn eller mere, uden whitespaces af nogen art.

Håber der er en klog hund derude der kan hjælpe mig.

Jeg bruger preg-funktionerne i PHP btw.

På forhånd tak
Avatar billede nicklasb Nybegynder
28. februar 2009 - 19:03 #1
Hvad må strengen /ikke/ indeholde? Jeg mener - det ligner stort set at være alt - bare der er 15 af slagsen?

Det kan du klare med noget lignende ^[\w\W]{15}$

Hvis det skal være med lige præcis de tegn du har nævnt, kan det klares med noget lignende ^[a-zA-Z0-9,.:\s\t\n\r]{15}$
Avatar billede kongfjong Nybegynder
28. februar 2009 - 19:59 #2
Jeg ved ikke om jeg fik forklaret mig dårligt, men jeg vil bare gerne have, at der er minimum 15 stk. af bogstaver/tal egentlig :)

Har prøvet noget a la det du foreslår først, men dels så har du sat ^ og $ på, og der må gerne være whitespaces både i starten og i slutningen af strengen. Derudover vil dit regex kun matche strenge der har præcist 15 word characters.

Det andet matcher nogenlunde det samme, bare med flere gyldige tegn :)

Strengen må samlet gerne være større, men i den skal der bare være minimum 15 bogstaver/tal, uafhængigt af placeringen :)
Avatar billede ksoren Nybegynder
28. februar 2009 - 20:05 #3
/(?=.{15,})(=?.*[a-zA-Z]+)(=?.*\d+)/

minimum 15 tegn
minimum 1 tegn af a-zA-Z
minimum 1 tegn af 0-9
Avatar billede kongfjong Nybegynder
28. februar 2009 - 20:44 #4
Jeg har faktisk siddet og luret lidt på den der ?= kombination, men har ikke rigtig kunnet lure den. Kan du forklare den lidt?
Avatar billede ksoren Nybegynder
28. februar 2009 - 20:51 #5
http://dk.php.net/manual/en/regexp.reference.php

Forklarer det meget præcist:

"An assertion subpattern is matched in the normal way, except that it does not cause the current matching position to be changed."
Avatar billede kongfjong Nybegynder
28. februar 2009 - 21:31 #6
Hvilken betydning har "the current matching position"? Betyder det kort at den forsætter med at undersøge tråden for at finde de efterfølgende patterns, frem for at stille sig tilfreds med det første match?
Avatar billede ksoren Nybegynder
28. februar 2009 - 21:47 #7
/(?=.{15,})(=?.*[a-zA-Z])(=?.*\d)/

Du kan faktisk se på den som tre seperate udtryk. Hver parentes bliver matched fra starten af strengen.

Uden look ahead, /.{15,}.*[a-zA-Z].*\d/

skal strengen starte med 15 vilkårlige tegn
efterfulgt af .*
efterfult af [a-zA-Z]
efterfulgt af .*
efterfulgt af \d
Avatar billede kongfjong Nybegynder
28. februar 2009 - 23:05 #8
Ah okay, og hvis der havde været et "almindeligt" pattern, f.eks. [a-z]+ før det første look ahead, ville hver parantes gøre, at regexen vendte tilbage til indexet for hvor [a-z]+ matchede?
Avatar billede kongfjong Nybegynder
11. april 2009 - 16:20 #9
ksoren, lig et svar ;)
Avatar billede kongfjong Nybegynder
24. april 2009 - 20:07 #10
Jeg lukker :)
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