Pokud regexp engine, který používáte, podporuje vyhlížení, můžete nejprve zkontrolovat, že vstup nejsou jen číslice nebo jen písmena, a pak teprve použít vaši kontrolu. Pokud to nepodporuje, budete si to muset ošetřit přímo v aplikaci, tj. udělat ty testy za sebou dva nebo tři (podle toho, zda „jenom písmena“ a „jenom číslice“ otestujete v jednom nebo dvou krocích).
Dik, zkoušel jsem i toto, /^(?=.*?\d)(?=.*?[A-Z])[A-Z\d]+$/
ale dosud všechny moje pokusy skončily na tom {16}
No to {16} tam určitě musí být, aby to odpovídalo přesně 16 znakům.
Třeba tohle by mělo fungovat, tam kde se používá PCRE: ^(?![0-9]{16})(?![A-F]{16})[0-9A-Z]{16}$
dik moc
já nevím , to by asi znamenalo 16cisel AND 16pismen AND 16znaku , ne ?
proc to ?! a ne ?=
som z toho volaaký zmätený
Ne, vyzkoušejte si to, třeba online na
https://regex101.com Akceptuje to text, který je dlouhý právě 16 znaků a skládá se jen z číslic nebo velkých písmen, a zároveň to nejsou jenom číslice nebo jenom písmena (neboli musí tam být písmena i číslice).
(?!…) je tzv. negativní vyhlížení – tj. kurzor jakoby zůstane na místě, ale podívá se dopředu, zda je tam to, co odpovídá výrazu v závorce. U pozitivního vyhlížení by to bylo splněné tehdy, když tam takový text je, u negativního je podmínka splněná, když tam takový text není. Tj.
(?![0-9]{16}) se podívá dopředu, zda tam není 16 číslic – když je, tak tahle část nevyhoví. Další skupina se podívá, zda tam není 16 písmen. Když je tam jen šestnáct písmen, tak výraz nevyhoví. A pak se teprve začne kurzor posouvat a 16krát porovná, zda je daný znak číslice nebo písmeno. Když ano, narazí na
$, takže už jen zkontroluje, zda je na konci vstupu.