Форум: "Прочее";
Текущий архив: 2017.10.29;
Скачать: [xml.tar.bz2];
ВнизМножественная замена Найти похожие ветки
← →
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, "<", "<<");
OneReplace(s, "<", "<<");
OneReplace(s, "<", "<<");
OneReplace(s, "&DEG;", "°");
OneReplace(s, "°", "°");
OneReplace(s, "°", "°");
...
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.001 c