Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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, "&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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.001 c
2-1448911691
gedevan
2015-11-30 22:28
2017.10.29
Где объявлен тип TADOXCatalog?


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


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


15-1467207680
Pavia
2016-06-29 16:41
2017.10.29
Множественная замена


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский