Nietypowe podzielenie stringu

0

Witam. Potrzebuje rozłożyć pewien string na czesci :) Moze na przykladzie:

Dane wejsciowe:
["\"hello world\" ".chr(ord("!"))." ".#13."aaa\nbbb"] (bez [ i ])

Dane wyjsciowe :

\"Hello world\" 
chr(ord("!"))
#13
"aaa\nbbb"

Czyli mniej wiecej lamanie ciagu znakow tak zeby przypadkiem nie podzielilo jesli kropka jest pomiedzy cydzyslowiem i zeby ignorowalo takie znaki jak (, ), i kazdy nastepny znak po \ byl sprawdzany osobno i zamieniany na znak (\n na #13 \r na #10 " na " itp). <ort>na razie</ort> wykodzilem cos takiego :

function extractfrom(s: string; deli: char): string;
var
  i, j              : integer;
  naw               : integer;
  b                 : boolean;
  x, ss             : string;
  par               : tstrlist;

//TStrList - prawie identyczna z TStringList, mozna zamienic na TStringList
begin
  x := s + deli;
  par.Init;
  naw := 0;
  b := false;
  for i := 1 to length(x) do
  begin
    if (x[i] = '(') and (not b) then
      inc(naw);
    if (x[i] = ')') and (not b) then
      dec(naw);
    if (x[i] = '"') and (x[i - 1] <> '\') then
      b := not b;
    ss := ss + x[i];

    if (x[i] = deli) and (not b) and (naw = 0) then
    begin
      par.add(stringreplace(copy(ss, 1, length(ss) - 1), '\"', '"',
        [rfreplaceall]));
      ss := '';
    end;
  end;
  result := par.Text;
end;

W zasadzie ten kod jest dobry, poza tym ze ma problemy z " i czasem sie gubi przy nie poprawnych danych ort!.

0

Nie zrozumiałem na jakich zasadach łańcuch ma zostać podzielony... Twój przykład jest trochę jakiś taki chaotyczny i nie widzę prawidłowości przy ekstrakcji ciągu "aaa\nbbb" - dlaczego ten ostatni cudzysłów nie został pominięty tak jak ten pierwszy przed hello world'em? Sprecyzuj to wszystko jeszcze raz.

Poza tym napisałeś

...czasem sie gubi przy nie poprawnych danych
Napisz przy jakich.

Nie analizowałem kodu więc wyjaśnij też po co zliczasz nawiasy.

PS: Póki co to zauważyłem jeden błąd - przy warunku

x[i - 1] <> '\'

powinieneś także sprawdzać wartość i, bo jeśli i =1 i długość Length (x) będzie wynosić 47 to będzie problem.

Pozdrawiam.

0
Dannte napisał(a)

Nie zrozumiałem na jakich zasadach łańcuch ma zostać podzielony... Twój przykład jest trochę jakiś taki chaotyczny i nie widzę prawidłowości przy ekstrakcji ciągu "aaa\nbbb" - dlaczego ten ostatni cudzysłów nie został pominięty tak jak ten pierwszy przed hello world'em? Sprecyzuj to wszystko jeszcze raz.

Poza tym napisałeś

...czasem sie gubi przy nie poprawnych danych
Napisz przy jakich.

Nie analizowałem kodu więc wyjaśnij też po co zliczasz nawiasy.

PS: Póki co to zauważyłem jeden błąd - przy warunku

x[i - 1] <> '\'

powinieneś także sprawdzać wartość i, bo jeśli i =1 i długość Length (x) będzie wynosić 47 to będzie problem.

Pozdrawiam.

Faktycznie troche sie pomylilem przy przykladzie. Ogolnie powinno byc tak ze trzeba podzielic ciag znakow tak zeby kropka nie znalazla sie pomiedzy " i " i zeby zamienilo " na " :>

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