

C# split podle regexu
Zdravím, potřebuji poradit s regexem v C#.
Mám lineární rovnici např: '10x-5y=6' a já potřebuji rozdělit levou stranu, tj '10x-5y' podle '+' a '-' a to včetně těchto delimiterů.
Tímto příkazem:
array = Regex.Split(left_part, @"(?<=[+-])");
dostanu z '10x-5y' pole, které má prvky: '10x-' a '5y', jenže já potřebuji '10x' a '-5y'.
Určitě to půjde jen nějakou úpravou toho regexu, jenže já nevím jak.
Samozřejmě bych to mohl projít a opravit sám, jen mi to přijde jako zbytečná práce.
Díky.
Neverim ze to co si napisal robi to co pises (lebo ?<= nebude nikdy match) //EDIT: jaj berem spet to je nejaky spetny nezmysel, malo by byt nepodstatne
Podla mna spravne by malo
array = Regex.Split(left_part, @"([+-])");
rozdelit ten string na 3 casti, a ty si spojis druhu s tretou a budes mat minus spolu s tou castou.
http://msdn.microsoft.com/cs-cz/library/8yttk7sy%2 8v=vs.110%29.aspx
priklad v strede stranky
Ano, to také funguje, ale stále by nešel vymyslet takový regex, který by mi delimiter schoval vždy do té druhé části na začátek?
Pořád je tohle práce taky navíc.
Ja v MSDN nikde nevidim ze by ta fcia pripajala to znamienko ku ktoremukolvek stringu. Navyse odstrihavat posledny znak mozes aj ked mas 3 stringy, a este k tomu aj budes mat extra ulozene to znamienko
Jako jo, dá se to takhle považovat za vyřešený, už si to spojím sám
Díky.
Na co to chces zas spajat? Do cyklu si das if. To snad neni tolko roboty
Na rozdelenie používaš kladné tvrdenie o predchádzajúcom (positive lookbehind), čiže sa to rozdelí tam, kde bol predchádzajúci znak + alebo -.
Keď chceš, aby sa to rozdelilo tam, kde bude nasledujúci znak + alebo -, musíš použiť kladné tvrdenie o nasledujúcom (positive lookahead): @"(?=[+-])"
To je přesně ono! Díky.
Mohl bys mi vysvětlit ten druhý parametr obecně? Proč je před výrazem zavináč? K čemu slouží ten otazník s rovná se?
Zavináč označuje doslovný reťazec (verbatim string) a zabezpečuje to, že reťazec sa použije od slova do slova tak, ako je napísaný. To znamená, že sa nepoužijú žiadne escape sekvencie. Jediné, čo musíš v takomto reťazci escapovať, sú dvojité úvodzovky (escapujú sa tak, že napíšeš dve dvojité úvodzovky za sebou).
V tomto prípade síce nie je zavináč potrebný, ale v regulárnych výrazoch sa dosť často používa na escapovanie spätné lomítko, takže v klasickom reťazci bez zavináča by si ho musel escapovať ešte raz. Aby regulárne výrazy zostali čitateľné, píšu sa takto so zavináčom.
O syntaxi regulárnych výrazov by sa dali písať články. Konkrétne otáznik na začiatku skupiny sa používa pri špecifikovaní vlastností, ktoré platia pre tú skupinu. Môžeš napr. nastaviť, že sa nemá capturovať. V tomto konkrétnom prípade to rovná sa hneď na začiatku za otáznikom definuje tzv. kladné tvrdenie o nasledujúcom (positive lookahead), t.j. definuje miesto, za ktorým sa nachádza to, čo je definované v skupine (v tomto prípade znaky plus a mínus).
Strucna regex referencia je aj na MSDN http://msdn.microsoft.com/cs-cz/library/az24scfc%2 8v=vs.110%29.aspx
ale prepni si to asi na anglictinu lebo ten strojovy preklad je nepouzitelny :)
Vysvetluje sa tam ze ktory retazec zodpoveda danemu regexu (v pravom stlpci mas priklad). Na fciu Regex.Split sa to dost blbo prenasa ptz ta fcia je uplne chaoticky popisana (raz to match string odstrani, raz ho prilepi, co vobec neni v MSDN popisane, ale los ako vzdy ma pravdu :)
P.S. ja to chapem tak ze tam mas potom match prazdny string (0znakov) a preto ten Split neurobi ten treti string (ten by bol 0znakovy). A ty vlastne udavas kde sa ten 0znakovy string nachadza, ci pred alebo po znamienku. Je mi to novinka, ale asi to bude tak.