При парсинге сайта (bash.im) и при использовании компонента TRegExpr и компиляции программы под Windows все работает нормально:
procedure TForm1.Button22Click(Sender: TObject);
var
s: string;
regexpr: TRegExpr;
ss: TStringStream;
begin
ss := TStringStream.Create('', TEncoding.GetEncoding(1251));
try
IdHTTP1.Get('http://bash.im/', ss);
ss.Position := 0;
s := ss.DataString;
finally
ss.Free;
end;
regexpr := TRegExpr.Create;
try
regexpr.Expression :=
'class="date">(.*?)<.*?class="id">(.*?)<.*?class="text">(.*?)<';
if regexpr.Exec(s) then
repeat
mmoLetters.Lines.Add(regexpr.Match[1]);
mmoLetters.Lines.Add(regexpr.Match[2]);
mmoLetters.Lines.Add(regexpr.Match[3]);
until not regexpr.ExecNext;
finally
regexpr.Free
end;
end;
Но при компиляции приложения под Android, выдает ошибку...
Использую RegularExpressions из состава Delphi 10 Seattle:
uses
System.RegularExpressions
...
procedure TfrmMain.ParsingBashNew(URLToPars: string);
var
Matches: TMatchCollection;
RegExpr: TRegEx;
i: Integer;
RegularExpressString : string;
begin
mmoNew.Lines.Clear;
HTMLText := IdHTTP1.Get(URLToPars);
RegularExpressString := 'class="date">(.*?)<.*?class="id">(.*?)<.*?class="text">(.*?)<';
RegExpr := TRegEx.Create(RegularExpressString, [roIgnoreCase, roMultiLine]);
Matches := RegExpr.Matches(HTMLText);
if Matches.Count > 0 then
begin
mmoNew.BeginUpdate;
for i := 0 to Matches.Count -1 do
begin
mmoNew.Lines.Add(Matches.Item[i].Groups[1].Value);
mmoNew.Lines.Add(Matches.Item[i].Groups[2].Value);
mmoNew.Lines.Add(Matches.Item[i].Groups[3].Value);
mmoNew.Lines.Add('==============================');
end;
mmoNew.EndUpdate;
end;
end;
То же самое регулярное выражение на работает. В чем может быть загвоздка? (если отбросить последнюю составляющую регулярки - '.*?class="text">(.*?)<' - тоже все работает!)
Вопрос
HyperZen
Добрый день!
При парсинге сайта (bash.im) и при использовании компонента TRegExpr и компиляции программы под Windows все работает нормально:
procedure TForm1.Button22Click(Sender: TObject); var s: string; regexpr: TRegExpr; ss: TStringStream; begin ss := TStringStream.Create('', TEncoding.GetEncoding(1251)); try IdHTTP1.Get('http://bash.im/', ss); ss.Position := 0; s := ss.DataString; finally ss.Free; end; regexpr := TRegExpr.Create; try regexpr.Expression := 'class="date">(.*?)<.*?class="id">(.*?)<.*?class="text">(.*?)<'; if regexpr.Exec(s) then repeat mmoLetters.Lines.Add(regexpr.Match[1]); mmoLetters.Lines.Add(regexpr.Match[2]); mmoLetters.Lines.Add(regexpr.Match[3]); until not regexpr.ExecNext; finally regexpr.Free end; end;Но при компиляции приложения под Android, выдает ошибку...
Использую RegularExpressions из состава Delphi 10 Seattle:
uses System.RegularExpressions ... procedure TfrmMain.ParsingBashNew(URLToPars: string); var Matches: TMatchCollection; RegExpr: TRegEx; i: Integer; RegularExpressString : string; begin mmoNew.Lines.Clear; HTMLText := IdHTTP1.Get(URLToPars); RegularExpressString := 'class="date">(.*?)<.*?class="id">(.*?)<.*?class="text">(.*?)<'; RegExpr := TRegEx.Create(RegularExpressString, [roIgnoreCase, roMultiLine]); Matches := RegExpr.Matches(HTMLText); if Matches.Count > 0 then begin mmoNew.BeginUpdate; for i := 0 to Matches.Count -1 do begin mmoNew.Lines.Add(Matches.Item[i].Groups[1].Value); mmoNew.Lines.Add(Matches.Item[i].Groups[2].Value); mmoNew.Lines.Add(Matches.Item[i].Groups[3].Value); mmoNew.Lines.Add('=============================='); end; mmoNew.EndUpdate; end; end;То же самое регулярное выражение на работает. В чем может быть загвоздка? (если отбросить последнюю составляющую регулярки - '.*?class="text">(.*?)<' - тоже все работает!)
Изменено пользователем Brovin Yaroslav2 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.