-
Все же писали свои парсеры? Может у кого есть код множественной замены? Надо спец символы 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. Книжку, которую искал, нашёл.
-
Общая логика такова: имеем две строки: исходную и целевую. В исходной строке ищем заменяемую последовательность символов, начинающуюся на & и кончающуюся на ;. Сбрасываем данные в целевую строку с заменой на новую последовательность. У меня есть код, но он а) специфический б) написан на C++
-
отталкиваться не от словаря замен, а от вхождения подлежащих замене в исходный текст. следующее вхождение искать с последней найденной позиции
сейчас же каждая замена просматривает весь текст целиком
-
-
-
А какая религия запрещает велосипедистам использовать всю таблицу html entities, а не только amp, lt, gt, и quot? Даже nbsp они не почесались сделать...
-
> Вот такой медленно работает
неплохой образец кода... самое ужасное, что когда самый дешевый ноут будет со 128 ядрами, а память сразу встроенная 500 терабайт - именно так будут программировать. сейчас, к счастью, железо не дает :)
-
Игорь Шевченко, не вариант многое надо переделывать. Dimka Maslov, спасибо за код. А почему дженерики не используете? http://docwiki.embarcadero.com/CodeExamples/Berlin/en/Generics_Collections_TArray_(Delphi) KilkennyCat, > сейчас, к счастью, железо не дает :)
Даёт. Задача одноразовая. Пока что ориентировочно обсчёт займёт 1-2 суток без оптимизации, нет смыла тратиться на ручную оптимизацию. Просто если бы был полностью готовый код было бы замечательно.
-
Данная задача (замена одних известных и не особенно длинных строк на другие, прямо как в вопросе) вполне себе быстро и за один проход может быть решена созданием машины состояний.
-
Я прекрасно знаю что реализуется машиной состояний. Как раз автомат и есть такая машина. Для этого можно использовать TRegEx. Он мне больше подходит так как может заменять не символом, а строкой. Вопрос в том как вставить туда Evaluator: TMatchEvaluator. А анонимную функцию TMatchEvaluator проглотит? Или обязательно объект создавать? Внутри как раз можно будет бинарный поиск через коллекцию сделать.
-
> Pavia © (01.07.16 16:11) [7]
для одноразовой, согласен. и более страшное наспех лепили.
|