Найти шаблоны в длинной строке? - PullRequest
1 голос
/ 19 января 2011

У меня есть страница HTML размером 40 КБ, и я хочу найти в ней определенные шаблоны.

Я могу прочитать его по буферу 1 КБ, но я хочу избежать ситуации, когда шаблон, который я ищу, будет разделен между двумя чтениями из буфера.

Как преодолеть эту проблему?

Ответы [ 4 ]

3 голосов
/ 19 января 2011

Это легко.Вы считаете самый длинный шаблон, который вы ищете, затем либо возвращаете указатель файла обратно на эту величину, либо прокручиваете файл, считывая только дельту.

Представьте, что самый длинный шаблон составляет 26 байтов.

  1. Чтение 1k.
  2. Проверка всех шаблонов -> ничего.
  3. Удаление 1k - 26 байт из буфера.
  4. Чтение 1k - 26 байт из потокаи добавьте в свой буфер
  5. Перейти к 2.

Редактировать: Позвольте мне уточнить: Есть два способа сделать это, оба имеют свои преимущества.Тот, который я задокументировал выше, лучше всего использовать, если вы читаете из потока, что означает источник данных, который не поддерживает поиск.Однако, если ваш источник данных поддерживает поиск (например, файл файловой системы), вы можете легко сделать то же самое с помощью поиска.Проверьте шаблон, если он не найден, отыщите размер самого длинного шаблона и начните с него.

Если, однако, вы хотите поддерживать поиск шаблонов, размер которых превышает размер буфера, вы можетенужен гораздо более умный алгоритм.Вам понадобится таблица поиска всех шаблонов, которые в данный момент «открыты», когда вы продолжаете читать больше данных, что, в свою очередь, будет стоить больше памяти - вы получите проблему.

2 голосов
/ 19 января 2011

Для этого предназначен класс Сканер .

1 голос
/ 19 января 2011

Вы можете взглянуть на CharBuffer, который реализует CharSequence именно для этой цели

0 голосов
/ 19 января 2011

Почему бы не использовать SAX-парсер . Он создан для обработки больших файлов разметки. Вы столкнетесь с проблемами только в том случае, если попытаетесь сопоставить разные элементы на одном и том же уровне. Однако это не невозможно обработать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...