Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Строку в список


Автор: JS2 10.2.2010, 17:27
Имеется строка вида: "aaa bbb";"bbb aa;a";"b;bb aaa". Нужно преобразовать ее в список. За символ- разделитель считать ;. 

Условия разделения на строки:

справа от символа-разделителя должена быть символ " либо это конец строки #0
слева от символа-разделителя должен быть симвод " либо это начало строки #0

Вот что пока набросал:

Код

procedure CheckSyntax(S: string; Delimiter: Char; out All: TStrings);
  var
    Curr: string;
    N, Z: Integer;
  begin
    while S <> '' do
    begin
      N := Pos(Delimiter, S);
      if N = 0 then
        N := Length(S) + 1;
      Curr := Copy(S, 1, N - 1);

      All.Add(Curr);

      Delete(S, 1, N);
    end;
  end;


Проблема собственно в том чтобы не разделять, если символ-разделитель имеет место быть но не соблюдаются вышеописанные условия. Подскажите че исправить.

Результат должен быть следующим:

"aaa bbb"
"bbb aa;a"
"b;bb aaa"


у меня же получается:

"aaa bbb"
"bbb aa;
a"
"b;
bb aaa"

Автор: Matematik 10.2.2010, 17:44
"Всё уже украдено сделано до нас" (с)
Код

  sl := TStringList.Create;
  try
    sl.QuoteChar := '"';
    sl.Delimiter := ';';
    sl.DelimitedText := '"aaa bbb";"bbb aa;a";"b;bb aaa"';
    ShowMessage(sl.Text);
  finally
    sl.Free
  end;

Автор: Mikel 10.2.2010, 17:46
Код

Memo1.Lines.Delimiter:=';';
Memo1.Lines.DelimitedText:='"aaa bbb";"bbb aa;a";"b;bb aaa"';

не пойдет? smile

Добавлено @ 17:47
Эх, Matematik опередил  )

Автор: JS2 10.2.2010, 17:52
нужно еще контролировать случаи, когда

"aaa b"bb";"aaa bb;b"

в этом случае дожно быть:

"aaa b" bb"
"aaa bb;b"

Автор: Mikel 10.2.2010, 18:00
Код

uses strUtils;

var s:string;
begin
s:='"aaa" bbb";"bbb aa;a";"b;bb aaa"';
Memo1.Lines.Text:=AnsiReplaceStr(s,'";"','"'#13#10'"');


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)