Regulární výrazy   zodpovězená otázka

VB.NET

Zdravím,

dnes jsem se pohrával s následujícím úkolem:

Mám vstupní řetězec, obsahující v sobě různé významové skupiny znaků (promenna VstupniRetezec). Tyto skupiny jsou popsány v druhém řetězci VstupniMaska pomocí velkých písmen. Potřebuji do další proměnné VystupniRetezec přeskládat odpovídající skupiny znaků z proměnné VstupniRetezec, ale dle jiné masky, kterou mám v proměnné VystupniMaska. Takže raději snad příklad:

VstupniMaska: "AAAAAABBDDDCC"

VstupniRetezec: " 123456789045"

VystupniMaska: "BBBXXCCDDAAAAAA"

VystupniRetezec: " 67 4590 12345"

Masky ani skupiny v obou maskách nemusejí být stejně dlouhé, při skládání skupin se musí postupovat vždy odzadu. Když je ve výstupní masce na danou skupinu více pozic než ve vstupní, doplní se skupina ve VystupniRetezec zleva mezerami, když je naopak ve výstupní masce pro danou skupinu méně pozic než ve vstupní, vyplní se zprava jen do počtu pozic vymezených výstupní maskou a zbylé znaky se zahodí. Trochu jsem se zamotal ve vnořených cyklech a najednou koukám na nový článek o regulárních výrazech. Nešlo by to pomocí nich nějak elegantněji? Zkuste někdo poradit.

Díky moc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na toto bohužel regulární výrazy asi nepoužijete. Je to tak specifický problém, že musíte použít opravdu cykly.

První bych prošel masku a vytvořil seznam skupin (písmeno, počáteční index a délka). Následně udělal prošel výstupní masku a udělal to samé.

Nakonec stačí procházet výstupní skupiny a v každé z nich zkusit její ekvivalent najít v seznamu vstupních skupin. Pokud ji ve vstupních nenajdete, nebudete znaky vkládat. Pokud ji najdete, projdete vstupní znaky na pozici vstupní skupiny a zasadíte je do pozic výstupní skupiny.

Odhaduji to tak na 100 řádků kódu, možná ani ne. Pokud napíšete testy, nebude problém kód udržet.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Není toho zas tak moc - bez optimalizace tak 50 řádků kódu. A "vnořené cykly" které tazatel popisuje, to snad ani nevyžaduje.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Možná opravdu ne. I kdyby, tak maximálně do první úrovně, chce si to řešení rozdělit a jistě ho necpat do jednoho bloku kódu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jo, přesně tak (nésu-tak chytrej, ale ze zvědavosti jsem si to zkoušel :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky,

zkusím.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback