ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Фільтрація рядків з використанням автоматів
         

     

    Інформатика, програмування

    Фільтрація рядків з використанням автоматів

    Alexander Babaev

    Необхідність фільтрації рядків

    Строки використовуються дуже часто. А застосовне до Інтернет-програмування можна сказати, що рядки використовуються постійно. Будь-яка відповідь сервера - це рядок, запит клієнта - теж рядок. Робота з XML-файлами - це знову робота з рядками, нехай і дуже формалізована. Тому необхідно вміти швидко й ефективно обробляти рядкові дані. Основна операція, яка використовується - це конкатенація (злиття). Вона реалізована для всього, чого завгодно і зазвичай дуже прозора. Друга ж операція - Це зміна рядків. І тут думки щодо того, що використовувати, розходяться.

    Стандартні методи фільтрації рядків

    Для початку згадаємо, як відбувається робота з рядками у звичайній програмі. Використовується кілька методів. Перший можна назвати класичним. У цьому випадку для отримання результату використовуються стандартні операції пошуку, заміни, конкатенації та видалення частин рядка. Такий метод виправданий для швидкого вирішення найпростіших завдань, але як тільки потрібно реалізувати що-небудь більш-менш складне, миттєво починаються проблеми. Крім того, цей спосіб зовсім не масштабується і дуже складно змінюється.

    Другий метод - використання регулярних виразів (регекспов). Детально розглядати їх не має сенсу, є відмінна книга Дж. Фрідл [1], в якій все докладно описано, в тому числі й застосовне до Java. Переваги підходу полягають в тому, що регулярні вирази стандартизовані, володіють величезними можливостями і дуже компактно записуються. Тобто якщо ви навчилися використовувати регулярні вирази в Perl або PHP, вам нічого не варто використовувати їх в Java (хоча все одно доводиться щоразу з'ясовувати нюанси реалізації). Самий головний недолік -- складність, яка виростає з величезної потужності регулярних виразів. Прості регекспи може зрозуміти навіть початківець, але більш-менш складні починаючому вже не по зубах. Регекспи ж, подібні представленому в лістингу 1, не зрозуміє ніхто навіть при дуже великому бажанні (в лістингу представлена приблизно восьма частина регулярного виразу, призначеного для перевірки коректності e-mail адреси і його відповідності RFC). Втім, є люди, які «читають» регулярні вирази «з листа». Даний приклад не зовсім показовий у тому сенсі, що і програма, що виконує аналогічну функцію, буде дуже і дуже складна. Але є і набагато більш прості завдання, (приклади таких завдань будуть розглянуті нижче), в яких регулярні вирази використовувати так само незручно.

    Лістинг 1.Часть регулярного виразу, призначеного для перевірки коректності e-mail адреси, відповідності його RFC.        

    ^ [   

    */   

    public boolean isEnabled (IFilter aFilter);   

    /**   

      * Ініціалізація параметрів групи. Цей метод використовується в   

      * Основному для встановлення параметрів правила при завантаженні   

      * Конфігурації фільтра з XML.   

      * @ Param aParameters карта параметрів   

      */   

    public void setParameters (Map aParameters);   

    )     

    Для спрощення роботи з системою написано кілька класів, що допомагають при створенні нових фільтрів і правил. Такими класами є AbstractFilter і AbstractRule. Перший описує всі методи, необхідні для роботи стандартного фільтра. Тому для того, щоб створити потрібний фільтр, можна просто створити клас-спадкоємець AbstractFilter і в конструкторі викликати метод addRule (), додавши все необхідне в потрібній послідовності (лістинг 8).

    Лістинг 8. Складання фільтра з окремих правил.        

    public   class WikiFilter extends AbstractFilter   

    (   

    public WikiFilter (int aMaxWordLength, int   aMaxStringLength)   

    (   

    // заміна <на <   

    addRule (new ReplaceLeftTagBracketRule ());   

    // заміна & на &   

    addRule (new   ReplaceAmpersandTagBracketRule ());   

    //   правило екранування - для можливості виведення спецсимволів   

      addRule (new EkranRule ());   

      //Правило заміни http:// ... - Посиланнями   

      addRule (new AnchoringRule (aMaxWordLength ));   

      ... ... ...   

      //Правило розбивання довгих слів пробілами   

    addRule (new   BreakWordsRule (aMaxWordLength ));   

      //Правило «обрізання» довгих рядків   

      addRule (new MaxLengthRule (aMaxStringLength ));   

      )   

    )     

    Після цього обробка рядка даними фільтром являє собою тривіальну завдання:        

    String   result =   

    new WikiFilter (maxWordLength,   maxStringLength). process (sourceString);     

    AbstractRule визначає методи setEnabled () і isEnabled (), однакові для більшості фільтрів.        

    public   abstract class AbstractRule implements IRule   

    (   

      //Це поле зроблено ThreadLocal для того, щоб можна було одним   фільтром   

      //Обробляти кілька рядків одночасно   

    private ThreadLocal _enabledThreadLocal =   new ThreadLocal ()   

    (   

    protected Object initialValue () (   

    // за замовчуванням правило включається   

    return Boolean.TRUE;   

    )   

    );      

    public void setParameters (Map aParameters)   throws FilterException   

    (   

      //Для багатьох правил цей метод не використовується, тому робимо   

      //Його необов'язковим   

      )      

      public void initialize ()   

      (   

      //Так само, як і setParameters - робимо цей метод необов'язковим   

      )      

    public void setEnabled (boolean aEnabled)   

    (   

      _enabledThreadLocal.set (Boolean.valueOf (aEnabled ));   

    )      

    public boolean isEnabled ()   

    (   

    return ((Boolean)   _enabledThreadLocal.get ()). equals (Boolean.TRUE);   

    )   

    )     

    Є можливість відключати деякі правила безпосередньо в процесі роботи фільтру або між виконаннями методу process (). Можна також динамічно змінювати фільтр або налаштовувати його. При цьому не потрібно перекомпіляції код або самого фільтра.

    Також створений допоміжний клас CustomFilterFromXML, який дозволяє завантажити конфігурацію фільтра з XML-файл і автоматично її оновлює при зміні XML-файлу.

    Застосування

    Метод фільтрації рядків, представлений у цій статті, можна застосувати не тільки в вузькоспеціалізованої області роботи з інтернет-текстами. Створюючи різні правила, легко створювати рядки, які будуть керувати, наприклад поведінкою програми. Можливості необмежені. Описана тут система називається JFilter і розповсюджується вільно, її сторінка в інтернеті: http://blog.existence.ru/exception/.products.JFilter. Там можна знайти як бібліотеку у форматі jar, так і вихідні тексти з документацією. У додатку наведено код інтерфейсів фільтра та правила, які є основними інтерфейсами системи. JFilter використовується в системі блогів JDnevnik [6] і ще в декількох проектах.

    Правила, що входять в постачання

    Всі стандартні правила написані в стилі, допускає одночасну обробку фільтром кількох рядків, завдяки чому їх можна використовувати в многопоточной середовищі.        

    Стандартні правила   (jfilter.rules.general)         

    BreakWorksRule - розбиває   довгі слова пробілом.                      

    EkranRule - правило   екранування спецсимволів.                      

    MaxLengthRule - правило,   яке обмежує довжину рядків.             

    HTML-правила   (jfilter.rules.html)         

    AnchoringRule - заміна   тексту, що починається з http:// (або аналогів) і закінчується пробілом,   HTML-посиланням.                      

    MailRule - заміна тексту,   укладеного в прогалини і містить символ «@», HTML-посиланням.             

    емотікон   (jfilter.rules.smiles)         

    PreSmiler - заміна   позначень емотікон («:-)», «;)» і так далі) на їх стандартні   позначення для обробки SmilesRule'ом.                      

    SmilesRule - заміна   одиночних слів, укладених у парні двокрапки «::», HTML-картинками.             

    Транслітерація   (jfilter.rules.transliteration)         

    Lat2RusTransliterationRuleGroup   - Транслітерація. Відповідає ISO та ГОСТ (тобто можна писати як по   ГОСТом, так і позначеннями ISO; поки конфліктів такого варіанту я не   виявив).             

    Типографіка   (jfilter.rules.typografica)         

    AbbreviationsRule - заміна   (c), (p), (r), (tm) відповідними HTML-символи.                      

    HellipRule - заміна трьох   точок підряд символом «три крапки».                      

    LongDashRule - Заміна   символу «мінус», обрамленого пробілами символом «тире».                      

    QuotesRule - заміна «знака   дюйма »коректними лапками для російської мови.             

    Вікі-форматування   (jfilter.rules.wacko)         

    AnchorRule - створення   посилань у вигляді ((link )).                      

    BlockquoteRule - цитата   (>> текст >>).                      

    BoldRule - виділення   напівжирним шрифтом (** напівжирний **).                      

    HeaderRule - заголовок   (== заголовок ==).                      

    ItalicRule - виділення   курсивом (//курсив //).                      

    MonospaceRule - виділення   моноширинних шрифтом (# # моно ##).                      

    NoteRule - виділення   зауваження (span class = "note ").                      

    ParagraphRule - Робота з   перекладами рядки (одиночний переклад рядка -
    , дві підряд --   

    ).                      

    PreformattedRule --   виділення попередньо відформатованого тексту (%% вже форматрованний   текст %%).                      

    ReplaceAmpersandTagBracketRule   - Заміна символу "&" відповідним HTML-аналогом (&).                      

    ReplaceLeftTagBracketRule --   заміна символу "<" відповідним HTML-аналогом (<).                      

    SmallRule - виділення   дрібним шрифтом (+ + дрібний ++).                      

    StrikeRule - виділення   перекресленням (- перекреслений -).                      

    SubscriptRule - виділення   нижнім індексом (vvніжній індексvv).                      

    SuperscriptRule - виділення   верхнім індексом (^ ^ верхній індекс ^^).                      

    UnderlineRule - виділення   підкресленням (__подчерківаніе__).     

    Таблиця 1. Стандартні правила.

    Порівняння роботи різних типів обробки рядків        

    Властивість         

    Класичний спосіб         

    Регулярні вирази         

    Фільтрація             

    Простота реалізації         

    Просто         

    Дуже складно         

    Складно             

    Можливості зміни         

    Для простих завдань - дуже   великі, для складних - дуже складні         

    Тільки разом з   перекомпіляції вираження         

    Максимальні             

    Простота використання         

    Дуже просто         

    Просто для тих, хто   витратив багато часу на навчання         

    Дуже просто             

    Швидкість роботи         

    Швидко на простих   варіантах, звичайно повільно на складних, сильно залежить від реалізації         

    Швидко, якщо правильно   використовувати         

    Швидко     

    Таблиця 2. Порівняння різних типів обробки рядків.

    Висновок

    Хочеться відзначити, що бібліотека JFilter продовжує розвиватися, на даний момент реалізовано дуже багато, але далеко не всі з того, що хотілося б реалізувати. У найближчому майбутньому передбачається написання додаткових правил для класичної, «паперової» типографіки, які допомагали б редакторів, та верстальника самих звичайних, паперових книг/журналів/газет.

    Список літератури

    Фрідл Дж., Mastering Regular Expressions. Пітер, 2003 рік.

    http://is.ifmo.ru, Санкт-Петербурзький Державний університет інформаційних технологій, механіки і оптики, кафедра «Технології програмування ».

    Бабаєв А. "," МИР ПК - ДИСК. 2003. № 12, Транслітерація і як правильно її треба програмувати.

    http://is.ifmo.ru/projects/bone/ - створення скелетної анімації на основі автоматного програмування.

    http://wackowiki.com/projects/WackoFormatter -Бібліотека для форматування тексту WackoFormatter.

    http://blog.existence.ru/exception/.products.JDnevnik - Система блогів JDnevnik.

    Для підготовки даної роботи були використані матеріали з сайту http://www.rsdn.ru/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status