regexem na liczbe zespolona

0

Witam,

muszę wczytać liczbę zespoloną z konsoli, która może występować w 3 postaciach : a+ bi / a / bi , gdzie a,b to są jakieś liczby. Problem polega na tym, że jak wczytuje pełną postać liczby zespolonej to wyrzucany jest wyjątek, że analizowana grupa ma zbyt dużo nawiasów zamykających. A grupa z liczba urojona jest chyba cały czas pomijana, bo jakąkolwiek liczbę wpiszę to zawsze jest tylko część rzeczywista... Czy ktoś mógłby mi pomóc?

 private double[] privParse(string pobrano)
        {
            try
            {                                                                                  
                System.Text.RegularExpressions.Regex pattern = new System.Text.RegularExpressions.Regex(@"(?<re>\d+(,\d+){0,1})\(+/-)(?<im>\d+(,\d+){0,1})i");

                System.Text.RegularExpressions.Match macz = pattern.Matches(pobrano)[0];

                double[] liczby = new double[2];
                liczby[0] = Double.Parse(macz.Groups["re"].Value.ToString());
                liczby[1] = Double.Parse(macz.Groups["im"].Value.ToString());
                return liczby;
            }
            catch (ArgumentException e)
            {
                Console.WriteLine(e.Message);
                try
                {
                    System.Text.RegularExpressions.Regex pattern = new System.Text.RegularExpressions.Regex(@"(?<im>\d+(,\d+){0,1})i");

                    System.Text.RegularExpressions.Match macz = pattern.Matches(pobrano)[0];

                    double[] liczby = new double[2];
                    liczby[0] = 0.0;
                    liczby[1] = Double.Parse(macz.Groups["im"].Value.ToString());
                    return liczby;
                }
                catch (ArgumentException ex)
                {
                    Console.WriteLine(ex.Message);
                    try
                    {
                        System.Text.RegularExpressions.Regex pattern = new System.Text.RegularExpressions.Regex(@"(?<re>\d+(,\d+){0,1})");

                        System.Text.RegularExpressions.Match macz = pattern.Matches(pobrano)[0];

                        double[] liczby = new double[2];
                        liczby[0] = Double.Parse(macz.Groups["re"].Value.ToString());
                        liczby[1] = 0;
                        return liczby;//cacz, real, ERROR
                    }
                    catch (IndexOutOfRangeException)
                    {
                        throw new Exception("Zla liczba zespolona");
                    }
                    catch (ArgumentOutOfRangeException)
                    {
                        throw new Exception("Zla liczba zespolona");
                    }
                }
            }
        }
0

imho, olewajac biale znaki, regex na " +/- a | +/-a +/- bi | +/- bi " to:

^(?<re>(+|-)?\d+(,\d+)?)?((?<im>(+|-)?\d+(,\d+)?)i)?$

{0,1} zastapilem poprzez zwykly ? - przyznam ze nie pamietam czy silnik .net'a to akceptuje, ale powienien. + i - sa nieodlaczna czescia wartosci A lub B, o ile wystepuja w ogole. w efekcie, <re> oraz <im> dopasuja sie do calych liczb, juz ze znakiem

zwroc uwage, ze w a+-bi pomiedzy re a im nie musi byc jawnego separatora - wystapienie +/- rozpoczynajace czesc im juz jest wystarczajaco separujace. podobnie, rozroznienie miedzy a oraz bi -- liczba dopasuje sie do obu, ale to i na koncu zadecyduje w co regexp trafi. ah, oczywiscie zakladajac ze dasz kotwice..

1 użytkowników online, w tym zalogowanych: 0, gości: 1