Avatar billede sorenaakjaer Nybegynder
10. december 2011 - 09:47 Der er 8 kommentarer

Lidt hjælp til hvordan jeg bygger en RegEx som sikere at visse værdi'er ikke bliver skrevet.

Hej,

Jeg håber der er en eller anden som kan hjælpe.

Jeg har behov for at skrive en regular expression som kun tillader 8 cifret bogstaver eller tal, dog ikke værdierne værdierne:

00000000
11111111
22222222
33333333
44444444
55555555
66666666
77777777
88888888
99999999

og som ej heller må starte med 123

PFT
Avatar billede hansepeter2 Praktikant
10. december 2011 - 11:11 #1
"8 cifret bogstaver" så abcdefgh er også tilladt?
Avatar billede sorenaakjaer Nybegynder
10. december 2011 - 14:01 #2
Sorry.... Der må være 8 karaktere, altså både tal og bogstaver
Avatar billede Slettet bruger
10. december 2011 - 16:49 #3
I hvilket programmeringssprog vil du gerne bruge din regex, og præcist hvilke tegn tillades (f.eks. alle tal og bogstaver definieret i unicode, eller blot de danske, og skal det være med eller uden bogstaver der har accenter, f.eks. é).

Jeg har prøvet den her i Java (alle danske tal og bogstaver, men uden dem med accenter som du selv kan tilføje):
(?=^[0-9a-zA-ZæøåÆØÅ]{8}$)(?!0{8}|1{8}|2{8}|3{8}|4{8}|5{8}|6{8}|7{8}|8{8}|9{8}|^123.*)
Avatar billede sorenaakjaer Nybegynder
11. december 2011 - 17:29 #4
Jeg beklager det sene svar retur...

Det er perfekt med Unicode uden accenter.

Har du mulighed for at skrive den i PREG?
Avatar billede Slettet bruger
11. december 2011 - 17:52 #5
Jeg er ikke superstærk til php, men de eksempler jeg prøvede af, så ud til at fungere:
$pattern = '/(?=^[0-9a-zA-ZæøåÆØÅ]{8}$)(?!0{8}|1{8}|2{8}|3{8}|4{8}|5{8}|6{8}|7{8}|8{8}|9{8}|^123.*)/';
Og med unicode bogstaver og tal:
$pattern = '/(?=^\p{Xan}{8}$)(?!0{8}|1{8}|2{8}|3{8}|4{8}|5{8}|6{8}|7{8}|8{8}|9{8}|^123.*)/';
Og så kan du teste med: preg_match($pattern, '12345678')
Avatar billede sorenaakjaer Nybegynder
13. december 2011 - 09:14 #6
hmm... Jeg er ikke helt skarp i det her RegEx.

Jeg er faktisk lidt usikker på hvilket format skal jeg bruge

Jeg har lavet lidt selv, måske kan du fra nedenstående genneskue formatet. 

^(\w{8,8})$

men jeg kan altså ikke få det til at virke med frasortering af 8X1, 8x2 osv. + frasortering af 123osv.
Avatar billede Slettet bruger
13. december 2011 - 18:32 #7
\w{8,8} (mellem 8 og 8 tegn) kan du forkorte til \w{8} (præcis 8 tegn). \w tillader, udover tal og bogstaver, også tegnet _.

Da du gerne vil teste dit input på to forskellige måder, hvor den skal passe med et pattern X og ikke må passe med et pattern Y, så brugte jeg denne metode:
(?=X)(?!Y)
Først tjekker den om dit input passer med X, og så starter den forfra med at tjekke at dit input ikke passer med Y. Der er en længere forklaring på hvordan (?=u) og (?!u) fungerer her:
http://www.regular-expressions.info/lookaround.html

Du kunne også teste dit input to gange, først positivt for:
^\w{8}$
og bagefter tjekker du at den ikke har 8 ens cifre og ikke starter med 123:
^(0{8}|1{8}|2{8}|3{8}|4{8}|5{8}|6{8}|7{8}|8{8}|9{8}|^123.*)$

Jeg ved ikke om det kan gøres meget simplere. Der er så mange muligheder med regex, men det bliver lidt svært når den skal opfylde et krav og ikke må opfylde et andet. :)
Avatar billede mr-kill Nybegynder
15. marts 2012 - 23:33 #8
En mulig løsning i php, der opfylder de krav du har skrevet:

<?php

$regex = "/^(?!(123|0{8}|1{8}|2{8}|3{8}|4{8}|5{8}|6{8}|7{8}|8{8}|9{8}))[a-z0-9æøå]{8}$/i";

$tests[] = "12331337";
$tests[] = "00000000";
$tests[] = "11111111";
$tests[] = "22222222";
$tests[] = "33333333";
$tests[] = "44444444";
$tests[] = "55555555";
$tests[] = "66666666";
$tests[] = "77777777";
$tests[] = "88888888";
$tests[] = "99999999";
$tests[] = "77777770";
$tests[] = "a1234567";
$tests[] = "a12345_7";

for($i = 0; $i < count($tests); $i++)
{
  echo $tests[$i] . ": " . (preg_match($regex, $tests[$i]) ? "true" : "false") . "<br />\n";
}
?>

Udskriver:

12331337: false
00000000: false
11111111: false
22222222: false
33333333: false
44444444: false
55555555: false
66666666: false
77777777: false
88888888: false
99999999: false
77777770: true
a1234567: true
a12345_7: false
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