Jeg skal forsøge. :^)
Løsningen er bygget over denne her skabelon:
^(?=.*?regex1)(?=.*?regex2)(?=.*?regex3)(?=.*regex4)(?=.*regex5).*$
I dette tilfælde indgår der kun to under-regexp'er:
^(?=.*?regex1)(?=.*?regex2).*$
Altså:
regex1 = [a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9]
regex2 = [^a-z0-9]
- hvilket til sammen giver:
^(?=.*?[a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9])(?=.*?[^a-z0-9]).*$
Opskriften:
^(?=.*?regex1)(?=.*?regex2)(?=.*?regex3)(?=.*regex4)(?=.*regex5).*$
- bruges til at tjekke et udtryk som skal opfylde (matche) hver af betingelserne regex1, regex2, regex3, regex4, regex5, regex6 osv.
Det bliver lidt for meget at forklare grundreglen her, men du kan i stedet læse mine artikler om emnet her på Eksperten. Grundreglene bliver forklarte i den sidste artikel, men der er nok en giod ide at læse de andre først:
http://www.eksperten.dk/artikler/1156http://www.eksperten.dk/artikler/1157http://www.eksperten.dk/artikler/1160http://www.eksperten.dk/artikler/1162I stedet vil jeg forklare de to under-regler:
regex1 = [a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9].*?[a-z0-9]
regex2 = [^a-z0-9]
Du foreslog selv:
^[\w]{8,}
Men dels tillader den faktisk også tegn som ’_’, og har desuden den svaghed at alle tegnene skal står som naboer til hinanden – de kan ikke være adskilt af et tegn som er ”noget andet”.
[a-z0-9] matcher et tegn som er a-z eller 0-9. Der er 7 af dem i regex1 ovenfor. Dette sikre at der mindst er 7 sådanne tegn. Indimellem er der så nogle led, ”.*?”, som kan matche noget vilkårligt. Det er dem som sikre at regex1 også fungere uden at tegnene skal være naboer.
Regex2, [^a-z0-9], matcher et tegn som ikke er et af tegnene a-z eller 0-9. Dette er altså et ikke-alphanumerisk tegn. Regex2 sikre altså at der er minimum 1 sådant tegn. Hvis du vil være mere specifik omkring hvilke tegn du tillader som ikke-alphanumerisk tegn så er det dette led du skal tilrette.
Håber at det kastede lidt lys over det?