Как спарсить несколько значений с одной строчки?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by geve, 25 Apr 2011.

  1. geve

    geve New Member

    Joined:
    20 Mar 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    Есть строка ["Текст1"],["Текст2"],["Текст3"] из неё нужно получить Текст1,Текст2 и Текст3 у меня получается только Текст1 спарсить до остального хз как добраться.Каким циклом нужно воспользоваться?
     
  2. Jakeroid

    Jakeroid Member

    Joined:
    9 May 2009
    Messages:
    199
    Likes Received:
    12
    Reputations:
    1
    Подскажите какой язык, какими средствами можно пользоваться.
    Пример C#:
    Code:
    string pattern = @"\[\"(.*?)\"\]"
    Regex rgx = new Regex();
    MatchCollection mtchCol = rgx.Matches();
    foreach(Match mt int mtchCol)
        MessageBox.Show(mt.Groups[1].Value);
    
     
    1 person likes this.
  3. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    С++ Builder
    PHP:
    TStringListsl = new TStringList;
    String s "[\"Текст1\"],[\"Текст2\"],[\"Текст3\"]";
    while(
    s.Pos("["))
        
    s.Delete(s.Pos("["), 1);
    while(
    s.Pos("]"))
        
    s.Delete(s.Pos("]"), 1);
    sl->CommaText s;
    sl->Strings[0] == Текст1
    sl->Strings[1] == Текст2
    sl->Strings[2] == Текст3
     
  4. geve

    geve New Member

    Joined:
    20 Mar 2011
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    на delphi надо
     
    #4 geve, 25 Apr 2011
    Last edited: 25 Apr 2011
  5. patcher

    patcher Banned

    Joined:
    15 Dec 2009
    Messages:
    190
    Likes Received:
    37
    Reputations:
    10
    Как-то так:
    Code:
    function GetValue(s:string; ValNum:integer):string;
    var str:string; i,p:integer;
    begin
    str:=s;
    for i:=1 to ValNum do
    begin
    	p:=pos('["', str);
    	delete(str, 1, p+1);
    end;
    p:=pos('"]', str);
    GetValue:=copy(str, 1, p-1);
    end;
    
    Первым параметром передаешь строку, которую распарсить, вторым - номер значения, которое получить.
     
  6. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    ТС, ты не указал какой набор символов может быть в Текс1, Текст2 и т.д. Если запятые не присутствуют, то можно было бы строку "разрезать" на части, разделяющиеся символом ",".
    Code:
    type TStringArray = array of String;
    procedure Parse(Const Text : String; var Texts : TStringArray);
    Var i : Integer;
    Const Align = 10;
      function FindNextSubStr(SubStr : String) : Integer;
      Var j, k : Integer;
      Begin
          k := 1;
          for j := i to Length(Text) do
            if Text[j] = SubStr[k] then
            Begin
                if k >= Length(SubStr) then
                Begin
                    Result := i - Length(SubStr) + 1;
                    Exit;
                end;
                Inc(k);
            end else
              k := 1;
          Result := 0;
      end;
    Var a, b, s : Integer;
    Begin
        s := 0; i := 1;
        SetLength(Texts, 0);
        try
          while i <= Length(Text) do
          Begin
              //Определяем начало и конец области
              a := FindNextSubStr('["');
              if a = 0 then
                Exit;
              i := a + 2;
              b := FindNextSubStr('"]');
              if b = 0 then
                Exit;
              //Добавляем в массив
              if High(Texts) < s then
                SetLength(Texts, High(Texts)+Align+1);
              Texts[s] := Copy(Text, a+2, b-a-1);
              Inc(s);
              i := b + 2;
          end;
        finally
          SetLength(Texts, s);
        end;
    end;
    
     
  7. remedy

    remedy New Member

    Joined:
    25 Apr 2011
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Лучше использовать регулярки.
    Если Дельфи, то примерно так:

    PHP:
    RegExp.Expression := '\[(^\]*)\]';
    RegExp.Exec(str);
    pereat
      text
    [i] := RegExp.match[1];
      
    inc(i);
    until not RegExp.ExecNext;