Nietypowe podzielenie stringu

Odpowiedz Nowy wątek
2006-12-26 18:11
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>Narazie</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>wejsciowyh</ort>.

Pozostało 580 znaków

2006-12-27 01:16
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.

Pozostało 580 znaków

2006-12-27 15:04
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 " :>

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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