Regex pro pevnou délku řetězce

FKoudelka

Regex pro pevnou délku řetězce
« kdy: 20. 01. 2023, 14:44:15 »
Zdravím,
mořím se s tím půl dne, poradíte prosím někdo ?
jak bych napsal regex na odchytnuti napr. 361854EA825E3802

Velka písmena i cisla (oboje) Fixni delka 16 jako cele slovo
[A-Z0-9]{16} …. Tohle dává i 16 cisel nebo 16 pismen
Zkousim i toto, ale nefunguje

([A-Z]+[0-9]+|[0-9]+[A-Z]+){16}

Dik moc
« Poslední změna: 20. 01. 2023, 15:28:54 od Petr Krčmář »


hknmtt

Re:Regex dotaz
« Odpověď #1 kdy: 20. 01. 2023, 15:11:10 »
Tohle dává i 16 cisel nebo 16 pismen

A kde je problem?

FKoudelka

Re:Regex dotaz
« Odpověď #2 kdy: 20. 01. 2023, 15:18:41 »
Tohle dává i 16 cisel nebo 16 pismen

A kde je problem?
Potřebuju mix

Re:Regex dotaz
« Odpověď #3 kdy: 20. 01. 2023, 15:26:53 »
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).

Re:Regex pro pevnou délku řetězce
« Odpověď #4 kdy: 20. 01. 2023, 15:54:58 »
echo -e '361854EA825E3802\n1234567890123456\nABCDEFGHIJKLMOPQ\n' | grep -P '(?=[0-9A-Z]{16})(?=.*[A-Z].*)(?=.*[0-9].*)

ale je to rozsireny perlovsky regexp

marek


FKoudelka

Re:Regex dotaz
« Odpověď #5 kdy: 20. 01. 2023, 16:25:09 »
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}

Re:Regex dotaz
« Odpověď #6 kdy: 20. 01. 2023, 16:52:16 »
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}$

Re:Regex dotaz
« Odpověď #7 kdy: 20. 01. 2023, 17:11:35 »
Samozřejmě tam místo [A-F] má být [A-Z], nějak jsem se přepnul na představu, že tam mají být jen hexadecimální číslice :)

FKoudelka

Re:Regex dotaz
« Odpověď #8 kdy: 20. 01. 2023, 17:36:46 »
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ý

FKoudelka

Re:Regex dotaz
« Odpověď #9 kdy: 20. 01. 2023, 17:44:31 »
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ý
dává to 16+ znaků

hknmtt

Re:Regex pro pevnou délku řetězce
« Odpověď #10 kdy: 20. 01. 2023, 18:13:12 »
treba tie vysledky potom prefiltrovat, zbytocne riesit vsetko regexom

Re:Regex dotaz
« Odpověď #11 kdy: 20. 01. 2023, 18:37:23 »
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.

FKoudelka

Re:Regex dotaz
« Odpověď #12 kdy: 20. 01. 2023, 19:41:09 »
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.
super, diky za vysvetleni. regex101 jsem zkousel, ale davalo to 16+. zkuste 361854EA825E3802111 chcete-li
« Poslední změna: 20. 01. 2023, 19:45:39 od FKoudelka »

Re:Regex dotaz
« Odpověď #13 kdy: 20. 01. 2023, 19:53:17 »
super, diky za vysvetleni. regex101 jsem zkousel, ale davalo to 16+. zkuste 361854EA825E3802111 chcete-li
Mně na tenhle vstup regex101.com hlásí, že zadanému regulárnímu výrazu neodpovídá. Teprve když odmažu ty tři jedničky na konci, vstup odpovídá.

FKoudelka

Re:Regex dotaz
« Odpověď #14 kdy: 20. 01. 2023, 20:31:08 »
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.
Mate pravdu , nedal jsem tam ^ $
funguje to, dik moc, jeste musim vyresit okoli toho “slova”
« Poslední změna: 20. 01. 2023, 20:33:08 od FKoudelka »