Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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.

Předmět Autor Datum
Neverim ze to co si napisal robi to co pises (lebo ?<= nebude nikdy match) //EDIT: jaj berem spet to…
MM.. 12.11.2013 18:40
MM..
Ano, to také funguje, ale stále by nešel vymyslet takový regex, který by mi delimiter schoval vždy d…
freez2 12.11.2013 21:16
freez2
A proč to vůbec chceš takhle?
Wikan 12.11.2013 21:24
Wikan
Protože poté jen odstřihnu poslední znak, zjistím, co je to za proměnnou, uložím do matice na správn…
freez2 12.11.2013 21:26
freez2
Ja v MSDN nikde nevidim ze by ta fcia pripajala to znamienko ku ktoremukolvek stringu. Navyse odstri…
MM.. 12.11.2013 21:39
MM..
Jako jo, dá se to takhle považovat za vyřešený, už si to spojím sám Díky.
freez2 12.11.2013 21:49
freez2
Na co to chces zas spajat? Do cyklu si das if. To snad neni tolko roboty
MM.. 12.11.2013 21:50
MM..
Na rozdelenie používaš kladné tvrdenie o predchádzajúcom (positive lookbehind), čiže sa to rozdelí t…
los 12.11.2013 22:55
los
To je přesně ono! Díky. Mohl bys mi vysvětlit ten druhý parametr obecně? Proč je před výrazem zavin…
freez2 13.11.2013 00:08
freez2
Zavináč označuje doslovný reťazec (verbatim string) a zabezpečuje to, že reťazec sa použije od slova…
los 13.11.2013 10:21
los
Strucna regex referencia je aj na MSDN http://msdn.microsoft.com/cs-cz/library/az24scfc%2 8v=vs.110%… poslední
MM.. 13.11.2013 10:59
MM..

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): @"(?=[+-])"

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.

Zpět do poradny Odpovědět na původní otázku Nahoru