forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   regex в MidletPascal (http://forum.boolean.name/showthread.php?t=7500)

jkeks 25.12.2008 07:24

regex в MidletPascal
 
Задача простая:
Нужно скачать страничку и найти там нужные строки.
ПОнимаю что я не прав используя для этого MidletPascal, но java я изучать не хочу, а красота и минимализм MP - меня очень радуют, как и платформа ZX.
Вообщем Прочитать странички я могу, но искать текст строковыми функциями будет крайне неудобно. Какие варианты вообще есть, ведь я понял так что регулярные выражения - тема не раскрыта на форуме ?
Спасибо

Phantom 25.12.2008 07:37

Ответ: regex в MidletPascal
 
Регулярные выражения в Java? Лучше примитивами искать, так как даже если бы и были регулярные выражения, они бы обрабатывали всё ооочень медленно.

abcdef 25.12.2008 08:48

Ответ: regex в MidletPascal
 
несколько вопросов: какого максимального размера скачиваемая страница; какой именно текст нужно искать (между тегами или просто? одно слово или несколько?); на каком телефоне будет работать; действия после нахождения нужного текста? MIDdletPascal плох тем что после работы строковых функций в памяти остается много мусора... если будет время и мне понравится задачка - сделаю...

jkeks 25.12.2008 09:05

Ответ: regex в MidletPascal
 
Текст размером около 50 килобайт.
телефон - как минимум SE k300
Вытаскивать нужно ссылки из тэгов. <a href="http://ya.ru?z=1827398">
Вытащить нужно в данном случае 1827398 . регуляркой тут будет href="http://ya.ru?z=(\d+), откуда нужно получить $1
Но нельзя сказать что это единственная задача выпарсивания? но на данный момент я хотел бы решить именно такую задачу.

odd 25.12.2008 21:19

Ответ: regex в MidletPascal
 
А не проще ли просто искать текст ?z= и обрезать после него число.
Затача более чем простая. И регулярный выражения тут успользовать совершенно ни к чему.
Кстати, в будущем к библиотеке Lib_parse возможжно добавится и функция парсинга XML документов, что было бы полезно, к примеру, в данном случае.

abcdef 25.12.2008 21:31

Ответ: regex в MidletPascal
 
Практически полноценный html-парсер, можно производить парсинг любых тегов и их параметров.. делал для оптимизации html-страниц, где нужно было вырезать теги с учетом вложенности, или убирать ненужные параметры..
Код:

var
  res : resource;
  s,st,txt : string;
  id_txt : integer;
  i,len,b : integer;
  c : char;


procedure addText(s:string);
begin
  txt:=txt+s+chr(10);
  formRemove(id_txt);
  id_txt:=formAddString(txt);
end;


procedure nextb;
begin
  if (i<len) then
  begin
    b:=ord(getChar(s,i));
    i:=i+1;
  end;
end;


procedure nextstr;
begin
  while (b<=32) and (i<len) do nextb;  //убрать пробелы и т.д..
  if (b=ord('#')) or (b=ord(';'))
  or ((b>=ord('0')) and (b<=ord('9')))
  or ((b>=ord('A')) and (b<=ord('Z')))
  or ((b>=ord('a')) and (b<=ord('z'))) then
  begin  //получить строку
    st:='';
    repeat
      if (b>=65) and (b<=90) then b:=b+32;
      st:=st+chr(b);
      nextb;
    until (i>=len) or not (((b>=ord('0')) and (b<=ord('9'))) or ((b>=ord('A')) and (b<=ord('Z'))) or ((b>=ord('a')) and (b<=ord('z'))));
  end
  else if (b=ord('"')) then
  begin  //строку в двойных кавычках
    st:='';
    repeat
      st:=st+chr(b);
      nextb;
    until (b=ord('"')) or (i>=len);
    st:=st+'"';
    nextb;
  end
  else if (b=ord('''')) then
  begin  //строку в одинарных кавычках
    st:='';
    repeat
      st:=st+chr(b);
      nextb;
    until (b=ord('''')) or (i>=len);
    st:=st+'''';
    nextb;
  end
  else
  begin  //любой другой символ
    st:=chr(b);
    nextb;
  end;
end;


begin
  showForm;
  id_txt := formAddString('Programming by arT (c). [email protected]');
  res := openResource('/1.htm');
  if resourceAvailable(res) then
  begin
    s:='';
    len:=0;
    b:=readByte(res);
    while (b<>0) do
    begin
      s:=s+chr(b and 255);
      b:=readByte(res);
      len:=len+1;
    end;
    closeResource(res);
  end;
  i:=0;
  b:=0;
  addText('scan START ('+len+')...');
  repeat
    if b=ord('<') then
    begin
      nextb;
      nextstr;
      if (st='a') then
      begin
        nextstr;
        if (st='href') then
        begin
          nextstr;
          if (st='=') then
          begin
            nextstr;
            if (length(st)>8) then
            if (copy(st,1,8)='http://') then
            begin
              addText(st);  //нашли гиперссылку...
            end;
          end;
        end;
      end
      else if (st='/') then
      begin
        nextstr;
        if (st='html') then addText('/html => ok!');
      end;
    end
    else nextb; //следующий символ
  until (i>=len);
  addText('COMPLETED...');
  repeat delay(100); until false;
end.


12121 28.12.2008 19:46

Ответ: regex в MidletPascal
 
А можешь выложить пример как загружаешь страницу? А то у меня никак не выходит. Зараннее спасибо.

abcdef 28.12.2008 20:13

Ответ: regex в MidletPascal
 
а в MIDletPascal help глянуть не вариант? :) лучше предложить не смогу...

jkeks 29.12.2008 07:41

Ответ: regex в MidletPascal
 
ПОнятно, придется руками искать пока ?z=
Радует так же пока что это единственная пока задача, однако через какое-то время появятся похожие, думаю регулярки тут идеальное решение.

Phantom 29.12.2008 08:28

Ответ: regex в MidletPascal
 
Регулярки работают на основе тех же примитивных функций, на сколько я знаю. Но многие слишком часто использую регулярные выражения где надо и не надо. Конечно, регулярку написать проще, чем поиск кусков текста в цикле, но пострадает скорость работы приложения. Регулярные выражения - это же как бы надстройка над языком программирования. Java - это платформа, при написании под которую нужно всё максимально оптимизировать, вводить в неё в использование регулярные выражения - идиотизм.

jkeks 29.12.2008 09:00

Ответ: regex в MidletPascal
 
Да это холивар. По идее мне скорость работы JAVA не критична, а вот скорость разработки критична.Я за Регекспы. Пока же придется конечно пользоваться циклами, пока не найдется решение.

Phantom 29.12.2008 12:30

Ответ: regex в MidletPascal
 
Оно и не найдётся. Писать класс, эмулирующий регулярки, никто не будет.

123 12.02.2009 19:41

Re: regex в MidletPascal
 
Есть реализации для паскаля (легко найти такой гуглом), можно один из таких взять и портировать под MIDletPascal!

temned 12.02.2009 19:45

Ответ: regex в MidletPascal
 
Цитата:

можно один из таких взять и портировать под MIDletPascal!
Взять и 'портировать' можно все, вопрос ????и так понятно, но надо же портировать, возьми и портируй, а не говори, что легоко найти гуглем, найти все мона, а вот сделать, не каждый сможет

123 13.02.2009 08:50

Re: Ответ: regex в MidletPascal
 
Цитата:

Сообщение от TEMNED (Сообщение 97951)
Взять и 'портировать' можно все, вопрос ????и так понятно, но надо же портировать, возьми и портируй, а не говори, что легоко найти гуглем, найти все мона, а вот сделать, не каждый сможет

Cделать каждый может! Было бы достаточно желания! В данном случае, класс лишь немного подправить придётся, изменив синтаксис слегка(под спицифику этой реализации паскаля)... язык то один, лишь не большие различия в синтаксисе...
Да даже если бы с нуля надо было написать, а не портировать, не ужели это не выполнимо или на столько трудно? Всё упирается лишь во время, а не выполнимых задач нету!
А я портирую, если мне будет не удобена та прога, которую сейчас ставлю на замену MP (я сижу под GNU/Linux, и через wine юзать проги не люблю, но у этой проги есть минусы... хоть и будет работать нормально).
ЗЫ на данный момент проблему парсинга решаю иначе, на хост загрузил скриптик перловый, который парсит нужную мне страницу и выдаёт нужные даннные в нужном формате, а я это дело забираю своим мидлетом :)


Часовой пояс GMT +4, время: 21:52.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot