Delphi regexy ExecNext wyrzuca wyjątek.

0

Cześć. Dlaczego wywala mi wyjątek? Szukam, ale wszyscy podają taki przykład.

  RegExp.Expression := '"name":"(.*?)"';
    if RegExp.Exec(AInputStr) then
    begin
      repeat
        AName := RegExp.Match[1];
        Result.AddObject(AName, ChnDat);
      until not RegExp.ExecNext;
    end;

Jak wyciągam raz, wszysko jest w porządku, ale jak mam pętlę, to się sypie. Jeden exec za dużo?

0

Może byś tak podał więcej kodu i przede wszystkim treść wyjątku?

0
 function TMainForm.ParseChannelsList(AInputStr : string) : TStringList;
var
  ChnDat : TChannelData;
  RegExp : TRegExpr;
  List : TStringList;
  i : Integer;
begin
  RegExp := TRegExpr.Create;
  Result := TStringList.Create;
  List   := TStringList.Create;
  ChnDat := TChannelData.Create;

  // Blok.
  SplitRegExpr('window.sources =', AInputStr,List);
  AInputStr := List[1];
  List.Clear;
  SplitRegExpr('window.playUrl =', AInputStr,List);
  AInputStr := List[0];

  with ChnDat do
  begin
    AGfx := nil;
    AName := '';

    RegExp.Expression := '"name":"(.*?)"';
    if RegExp.Exec(AInputStr) then
    begin
      repeat
        AName := RegExp.Match[1];
        Result.AddObject(AName, ChnDat);
      until not RegExp.ExecNext;
    end;

  end;

  if RegExp <> nil then
  begin
    FreeAndNil(RegExp);
  end;
end;

Wyjątek, to "Access violation at..."

0

Ten kod raczej nie powinien powodować wyjątku z tym że jest bez sensu cały czas ten sam obiekt dodajesz do listy zmieniając tylko jego właściwość AName co w konsekwencji prowadzi do tego że wszystkie pozycje to ten sam obiekt (bo nie tworzysz nowego za każdym obiegiem pętli) z ostatnio ustawioną właściwością AName. Jedyny możliwy błąd w drugim obiegu pętli jaki mi się nasuwa widząc fragment kodu jaki podałeś i (pośrednio) związany RegExp to patrząc na wyrażenie regularne teoretycznie jest możliwe że zostanie zwrócony pusty ciąg znaków ( aby temu zapobiec powinieneś użyć "name":"(.+?)" ) a być może wspomniana wcześniej właściwość AName nie może być pustym ciągiem '' i właśnie na tym się wywala.

0

Dzięki. O to chodziło.

Result.Add(AName);

Samemu czasami trudno jest zauważyć takie rzeczy.

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