Niby z pozory zwykły replace a jednak nie.....

0

Witam pisze parser pewnego języka do c#

i mam mały problem z jedną rzeczą, jest następująca linijka w której potrzebuje zmienić następującą rzecz:
price = (High[i] + Low[i] + Close[i]) / 3;

potrzebuje zmienić aby było Close(i) czyli nawias kwadratowy na okrągły. Niby z pozoru proste ale jest 2 sprawa że w środku Close moze być np Close [i+k[b]] a ja potrzebuje zmienić tylko zew nawias na () a nie wszystko...

Ma ktoś pomysł ??

0

Musisz zamienic tylko pierwszy i ostatni nawias. Proste. A skąd wiedzieć, który jest pierwszy? To wiadomo. Pierwszy po Close. A ostatni? Po prostu masz zmienną, którą zwiększasz o 1, gdy znajdziesz [, a zmniejszasz, gdy znajdziesz ]. Gdy dojdzie do 0, to właśnie jest ten nawias.

pozdrawiaMM

0

sklepałem na szybkiego to co mówisz ale zamienia mi wszystkie ] w całym wyrażeniu... gdzies naknociłem zapewne...
[code]
if (l[counter].Contains("Close["))
{

                l[counter] = l[counter].Replace("Close[", "mql.Close(");
                if (l[counter].Contains("["))
                {
                    b++;
                }
                if (l[counter].Contains("]"))
                {
                    b--;
                }
                if (b == 0) l[counter] = l[counter].Replace("]", ")");
            }

[/code]

0

a nie mozesz length-5 ?

0
twistpl napisał(a):

a nie mozesz length-5 ?

sorry -7 bo spacje

0

na sztywno moge ale chodzi o to że wyrażenie z Close może być różne moze być linijka np Close[i+k];
albo Close[i]+...+... /20

0

To nie jest łatwe zadanie, a przynajmniej w tej chwili nie widzę "jednolinijkowej" metody...

"Close[ a[1] + b[7] ]"

int t

  1. Znajdź nawias otwierający '[' po Close. (i=indeks pierwszego nawiasu '[')
  2. Sprawdź i-ty znak:
  • jeśli jest '[', to t++
  • jeśli jest ']', to t--
  1. i++
  2. Powtarzaj krok 2., dopóki t != 0.
using System;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication15
{
    class Program
    {
        static void Main( string[] args )
        {
            string input = "price = (High[i] + Low[i] + Close[a[1]+b[3]+c[d[6]]] + Close   [b[5] + c[1]]";

            Console.WriteLine(Parse(input));
            Console.Read();
        }

        static string Parse( string input )
        {
            StringBuilder output = new StringBuilder(input);

            // Szuakmy Close
            var matches = Regex.Matches(input, @"Close\s*(\[)");

            // Dla każdego Close...
            foreach(Match match in matches )
            {
                int t = 0; // jak "gleboko" jestemy w nawiasach?

                // ... ustawiamy i na nawiasie otwierającym...
                for(int i = match.Groups[1].Index; i < input.Length; i++)
                {
                    char c = input[i];

                    if(c == '[')
                    {
                        // ... pierwszy nawias zamieniamy na okragly...
                        if(t == 0)
                            output[i] = '(';

                        t++;
                    }
                    else if(c == ']')
                    {
                        t--;

                        // ... nawias zamykajacy znaleziony...
                        if(t == 0)
                        {
                            output[i] = ')';
                            break;
                        }
                    }
                }
            }

            return output.ToString();
        }
    }
}
2
        static string Parse( string input )
        {
            StringBuilder output = new StringBuilder(input);

            var matches = Regex.Matches(input, @"Close\s*(\[)");

            foreach(Match match in matches )
            {
                int i = match.Groups[1].Index; // Indeks pierwszego '['

                output[i] = '(';
                int t = 1;

                // Szukamy indeks zamykającego ']'
                do
                {
                    i++;

                    if(!(i < input.Length))
                        throw new Exception("Nieprawidlowe wejscie");

                    char c = input[i];

                    if(c == '[')
                        t++;
                    else if(c == ']')
                        t--;
                }
                while(t != 0);

                output[i] = ')';
            }

            return output.ToString();
        }

Ładniejsza wersja powyższego kodu.

0

Zenek1999 dziękuje Ci bardzo o takie coś mi własnie chodziło. Siedziałem nad tym tydzień i nie było jasnego wyniku ... Jeszcze raz dzięki teraz jakoś pójdzie ;)

0

W takich momentach zaczynam doceniać wykład z VirtualStudy o algorytmice

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