[Regex] Parser formátu

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Nargon 3. 8. 2017 13:43

Ahoj,
Mám pomocí regulárního výrazu vytvořený parser dat, který jednak zkontroluje že je formát v pořádku a ještě data správně rozseká na jednotlivé části. Ale teď jsem narazil na problém a nevím co s tím.

Mám následující formát:
6 čísel - povinné
4 čísla - nepovinné
R - nepovinné
C nebo D - povinné
1 libovolné písmeno - nepovinné
desetinné číslo - povinné
čtyř písmenný kód - povinné
až 16ti místný libovolný text - nepovinné
// - oddělovač, použitý pouze pokud je přítomný následující text
až 16ti místný libovolný text - nepovinné

Příklady které to má vzít a rozparsovat na jednotlivé části:
161014C66,39ZDGHFSY0017784908-20//351438
1610141014C5,00HJFF2016-10-13/O:2AC//351437
1610151015RD59,47UTSB//435088
1610151015RD59,47UTSBABCD44542

Zatím mám tento regulérní výraz:
([0-9]{6})([0-9]{4})?(R?[CD])[A-Z]?([0-9,]{1,15})([A-Z]{4})([^/]{0,16})(//.{1,16})?

Viz test: https://regex101.com/r/88NrCt/3/

Funguje to celkem OK, až na ten druhý příklad, kde je součástí toho 16ti místného textu i znak lomítka. A tam mi to selže. Vlastně bych potřeboval aby tato část: [^/]{0,16} vzala vše až po dvě lomítka, teď to zařízne už jedno lomítko a to je nežádoucí stav, jedno lomítko by to mělo vzít. Ale zatím jsem se nějak nedobral toho jak to zapsat, teda pokud to vůbec jde.
Máte někdo nějaký nápad?
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod zivan 3. 8. 2017 14:53

Co tohle?
([0-9]{6})([0-9]{4})?(R?[CD])[A-Z]?([0-9,]{1,15})([A-Z]{4})((.{0,16})(//.{1,16})|(.{0,16}))
Lenovo Moto G5 Plus, Lenovo Thinkpad X220 (12,5" IPS, i5-2410, 16GB RAM, 120GB mSata Crucial M4 + 1TB Samsung) + 29" LG 29UM65 + 22" Eizo S2202W
zivan
Junior

Odeslat příspěvekod Nargon 3. 8. 2017 15:06

Díky, to vypadá celkem dobře. Sice to má jednu mušku a to fakt že když je přítomen oddělovač //, tak se ty dva texty nachází v group 7 a 8, a když tam ten oddělovač není tak to co bylo původně v group 7 je teď v group 9. Ale s tím si snad nějak programově poradím.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník