Конференция "Прочее" » Множественная замена
 
  • Pavia © (29.06.16 16:41) [0]
    Все же писали свои парсеры?
    Может у кого есть код множественной замены?
    Надо спец символы html заменить на символы Юникода.
    Спец символы - это такие символы которые между & и ;.
    http://www.theegglestongroup.com/writing/special_chars.php

    Собственно интересует быстрый код.  Вот такой медленно работает. Хотелось бы раз в 10 по быстрее.


    var
     RE:TPerlRegEx;

    ...
     RE:=TPerlRegEx.Create;
     RE.Options:=[preSingleLine, preCaseLess, preUnGreedy]
    ...

    procedure OneReplace(var InStr:String; FromStr:String; toStr:String);
    begin
     With RE do
      begin
      RegEx := FromStr;
      Subject := InStr;
      Replacement := toStr;
      ReplaceAll;
      InStr :=  Trim(Subject);
      end;
    end;

    procedure ReplaseSimvolsToChars(Stream:TBytesStream);
    var
     s:String;
     Bytes:TBytes;
    begin
     Stream.Seek(0,soBeginning);
     s:=TEncoding.Unicode.GetString(Stream.Bytes);

     OneReplace(s, ' ', ' ');
     OneReplace(s, ' ', ' ');
     OneReplace(s, ' ', ' ');

     OneReplace(s, '&', '&');
     OneReplace(s, '&', '&');
     OneReplace(s, '&', '&');

     OneReplace(s, '>', '>>');
     OneReplace(s, '>', '>>');
     OneReplace(s, '>', '>>');

     OneReplace(s, '<', '<<');
     OneReplace(s, '<', '<<');
     OneReplace(s, '<', '<<');

     OneReplace(s, '&DEG;', '°');
     OneReplace(s, '°', '°');
     OneReplace(s, '°', '°');
    ...


    PS. Книжку, которую искал, нашёл.
  • Dimka Maslov © (29.06.16 17:14) [1]
    Общая логика такова: имеем две строки: исходную и целевую. В исходной строке ищем заменяемую последовательность символов, начинающуюся на & и кончающуюся на ;. Сбрасываем данные в целевую строку с заменой на новую последовательность. У меня есть код, но он а) специфический б) написан на C++
  • poi © (29.06.16 17:37) [2]
    отталкиваться не от словаря замен, а от вхождения подлежащих замене в исходный текст.
    следующее вхождение искать с последней найденной позиции

    сейчас же каждая замена просматривает весь текст целиком
  • Dimka Maslov © (29.06.16 17:52) [3]
    Как-то вот так получается:

    http://www.daemys.com/f/unit.htm
  • Игорь Шевченко © (29.06.16 18:08) [4]
    1.
    http://stackoverflow.com/questions/1657105/delphi-html-decode

    2.
    "C:\Program Files\Embarcadero\RAD Studio\7.0\source\Win32\internet\httpapp.pas"

    И не надо изобретать велосипедов.
  • Dimka Maslov © (29.06.16 18:29) [5]
    А какая религия запрещает велосипедистам использовать всю таблицу html entities, а не только amp, lt, gt, и quot? Даже nbsp они не почесались сделать...
  • KilkennyCat © (30.06.16 14:28) [6]

    > Вот такой медленно работает

    неплохой образец кода... самое ужасное, что когда самый дешевый ноут будет со 128 ядрами, а память сразу встроенная 500 терабайт - именно так будут программировать.
    сейчас, к счастью, железо не дает :)
  • Pavia © (01.07.16 16:11) [7]
    Игорь Шевченко, не вариант многое надо переделывать.
    Dimka Maslov, спасибо за код.
    А почему дженерики не используете?
    http://docwiki.embarcadero.com/CodeExamples/Berlin/en/Generics_Collections_TArray_(Delphi)

    KilkennyCat,

    > сейчас, к счастью, железо не дает :)

    Даёт. Задача одноразовая. Пока что ориентировочно обсчёт займёт 1-2 суток без оптимизации, нет смыла тратиться на ручную оптимизацию. Просто если бы был полностью готовый код было бы замечательно.
  • DVM © (01.07.16 17:45) [8]
    Данная задача (замена одних известных и не особенно длинных строк на другие, прямо как в вопросе) вполне себе быстро и за один проход может быть решена созданием машины состояний.
  • Pavia © (01.07.16 18:07) [9]
    Я прекрасно знаю что реализуется машиной состояний. Как раз автомат и есть такая машина. Для этого можно использовать TRegEx. Он мне больше подходит так как может заменять не символом, а строкой.
    Вопрос в том как вставить туда Evaluator: TMatchEvaluator.
    А анонимную функцию TMatchEvaluator проглотит? Или обязательно объект создавать?
    Внутри как раз можно будет бинарный поиск через коллекцию сделать.
  • Kilkennycat © (01.07.16 19:54) [10]

    > Pavia ©   (01.07.16 16:11) [7]

    для одноразовой, согласен. и более страшное наспех лепили.
 
Конференция "Прочее" » Множественная замена
Есть новые Нет новых   [134433   +22][b:0][p:0]