Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.10.29;
Скачать: CL | DM;

Вниз

Множественная замена   Найти похожие ветки 

 
Pavia ©   (2016-06-29 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, "&LT;", "<<");
 OneReplace(s, "&#60;", "<<");
 OneReplace(s, "&#x3C;", "<<");

 OneReplace(s, "&DEG;", "°");
 OneReplace(s, "&#176;", "°");
 OneReplace(s, "&#xB0;", "°");
...


PS. Книжку, которую искал, нашёл.


 
Dimka Maslov ©   (2016-06-29 17:14) [1]

Общая логика такова: имеем две строки: исходную и целевую. В исходной строке ищем заменяемую последовательность символов, начинающуюся на & и кончающуюся на ;. Сбрасываем данные в целевую строку с заменой на новую последовательность. У меня есть код, но он а) специфический б) написан на C++


 
poi ©   (2016-06-29 17:37) [2]

отталкиваться не от словаря замен, а от вхождения подлежащих замене в исходный текст.
следующее вхождение искать с последней найденной позиции

сейчас же каждая замена просматривает весь текст целиком


 
Dimka Maslov ©   (2016-06-29 17:52) [3]

Как-то вот так получается:

http://www.daemys.com/f/unit.htm


 
Игорь Шевченко ©   (2016-06-29 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 ©   (2016-06-29 18:29) [5]

А какая религия запрещает велосипедистам использовать всю таблицу html entities, а не только amp, lt, gt, и quot? Даже nbsp они не почесались сделать...


 
KilkennyCat ©   (2016-06-30 14:28) [6]


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

неплохой образец кода... самое ужасное, что когда самый дешевый ноут будет со 128 ядрами, а память сразу встроенная 500 терабайт - именно так будут программировать.
сейчас, к счастью, железо не дает :)


 
Pavia ©   (2016-07-01 16:11) [7]

Игорь Шевченко, не вариант многое надо переделывать.
Dimka Maslov, спасибо за код.
А почему дженерики не используете?
http://docwiki.embarcadero.com/CodeExamples/Berlin/en/Generics_Collections_TArray_(Delphi)

KilkennyCat,

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

Даёт. Задача одноразовая. Пока что ориентировочно обсчёт займёт 1-2 суток без оптимизации, нет смыла тратиться на ручную оптимизацию. Просто если бы был полностью готовый код было бы замечательно.


 
DVM ©   (2016-07-01 17:45) [8]

Данная задача (замена одних известных и не особенно длинных строк на другие, прямо как в вопросе) вполне себе быстро и за один проход может быть решена созданием машины состояний.


 
Pavia ©   (2016-07-01 18:07) [9]

Я прекрасно знаю что реализуется машиной состояний. Как раз автомат и есть такая машина. Для этого можно использовать TRegEx. Он мне больше подходит так как может заменять не символом, а строкой.
Вопрос в том как вставить туда Evaluator: TMatchEvaluator.
А анонимную функцию TMatchEvaluator проглотит? Или обязательно объект создавать?
Внутри как раз можно будет бинарный поиск через коллекцию сделать.


 
Kilkennycat ©   (2016-07-01 19:54) [10]


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

для одноразовой, согласен. и более страшное наспех лепили.



Страницы: 1 вся ветка

Текущий архив: 2017.10.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.004 c
15-1467207680
Pavia
2016-06-29 16:41
2017.10.29
Множественная замена


15-1467236052
K-1000
2016-06-30 00:34
2017.10.29
MD5 из WinAPI


2-1449064629
sollip
2015-12-02 16:57
2017.10.29
Abbrevia Xe10 lzma


2-1448911691
gedevan
2015-11-30 22:28
2017.10.29
Где объявлен тип TADOXCatalog?


15-1467235801
Юрий
2016-06-30 00:30
2017.10.29
С днем рождения ! 30 июня 2016 четверг