Реферат: Фильтрация строк с использованием автоматов
Эти правила достаточно стандартны для практически любой системы, где используется работа с текстом. Существует множество вариантов их реализации. Самый распространенный – при помощи уже упоминавшихся регулярных выражений [5]. При этом строится по одному или несколько выражений на каждое правило, после чего они в определенном порядке применяются к строке. Выполнение каждого регулярного выражения – это один проход по строке, следовательно, таких прогонов будет огромное количество. Правда, большая часть из них будет пустой, но даже они занимают какое-то время.
Безусловно, можно написать такое регулярное выражение, которое будет исполнять все правила сразу, но, боюсь, что его написание займет не один день, а малейшее изменение потребует очень серьезных усилий.
Возможен другой вариант, который и подводит непосредственно к автоматному методу работы. Те, кто более глубоко интересовался регулярными выражениями, скажут, что автоматы и регэкспы – это одно и то же. Да, любое регулярное выражение – это всего лишь короткая строковая запись автомата. Но обсуждение такого рода различий выходит далеко за рамки статьи.
Код, обрабатывающий строку, называется фильтром. Фильтр посимвольно перебирает строку, и для каждого символа проверяет, есть ли обработчик этого символа. Если есть – то передает управление ему. Иначе просто добавляет символ в выходной поток и переходит к следующему.
На рисунке 1 представлен граф состояний автомата, управляющего работой фильтра.
Рисунок 1. Граф состояний автомата, управляющего работой фильтра.
Листинг 2 показывает, как эта логика реализована в коде.
Листинг 2. Реализация автомата.
public String process(String aString) throws FilterException { // что такое правила – будет объяснено чуть позже, тут они // инициализируются, потому что фильтр может быть использован // повторно initRules(); // проверим, что на вход получена корректная строка if (aString == null || aString.length() == 0) { return ""; } // инициализация Source source = new Source(aString); Result result = new Result(); // основной цикл длится, пока мы находимся «не в состоянии завершения» while (!result.getLastRuleResult(). equals(RuleResult.FILTER_FINISHED_PROCESSING)) { result.setLastRuleResult(RuleResult.CHAR_NOT_CHANGED); // строка обработана полностью К-во Просмотров: 415
Бесплатно скачать Реферат: Фильтрация строк с использованием автоматов
|