Реферат: Фильтрация строк с использованием автоматов

Эти правила достаточно стандартны для практически любой системы, где используется работа с текстом. Существует множество вариантов их реализации. Самый распространенный – при помощи уже упоминавшихся регулярных выражений [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
Бесплатно скачать Реферат: Фильтрация строк с использованием автоматов