Сравнить слово по маске.

Sorcus

Sorcus. A New Beginning.
Регистрация
10 Июл 2011
Сообщения
513
Реакции
1.002
Язык не важен, нужен алгоритм. Использование библиотек регулярных выражений избыточен для этой задачи. Нужно решение без использования этих библиотек. Так же решение должно находить совпадение за как можно меньшее количество шагов и быть максимально простым, на сколько это возможно технически.

Входные данные следующие:
Домены - example.com, blog.example.com, news.example.com, example.net, example.org
Маски - *.example.com, news.example.com, shop.example.net, *.org, *net*, news.*

Результат нужен следующий:
Домен example.com должен детектиться по маске *.example.com
Домен blog.example.com должен детектиться по маске *.example.com
Домен news.example.com должен детектиться по маске *.example.com (*, **)
Домен example.net должен детектиться по маске *net*
Домен example.org детектится по маске *.org

* - Детектится должо по первому совпадению с маской. Т.е. если есть совпадение - прекращаем дальнейшее сравнивание.
** - Тем не менее маски news.example.com и news.* так же валидны для домена news.example.com

Заранее спасибо за помощь :glob:
 
Последнее редактирование:
Маска типа example.*ws не рассматривается? (То есть, с произвольным блоком внутри запроса).
 
Хм... Без подключения библиотек, алгоритм пугающий получается. Семантический разбор строки - вообще штука очень рутинная.

В общем, на брутальном голом Паскале, будет как-то так...

Упс. Выложить исходник текстом прямо сюда не могу - движок рубит все, что считает html-тегами, поэтому вкладываю архивом. Основное сканирование строки с входными данными однократное, внутри него во вложенных циклах "пока" идет только сборка текущего результата по найденному совпадению, поэтому работать будет быстро, но сама выборка громоздкая.

Наверняка есть небольшая путаница с позицией бегунка i в основном блоке, потом подредактирую. Более быстрого способа разбора не вижу - иные конструкции, которые приходят мне в голову, ведут к уменьшению исходника, но существенному увеличению числа прогонов.

Протестил не все варианты запросов. Имеются сомнительные.

В частности, запрос типа "net*" лупит сообщение, что нет совпадений, т.к. случаи с наличием * в обработке отделены от точного поиска. Если ввести просто "net", то сработает корректно и выдаст его позиции в строке.

Кроме того, отваливается случай маргинального заполнения входных данных. Если во входящей строке inp_potok будет присутствовать адрес, начинающийся с точки, поиск "*.domen" найдет его дважды, как ".domen" и как "domen". Но такой вариант в постановке задачи, как я понимаю, не рассматривается.

Думаю, можно оптимизировать поиск процентов на двадцать (я не юзал процедуры, да и переменных многовато), но, честно говоря, не оч. хочется. Быстрее от этого он работать не станет, а голову ломать за два часа до нового года неохота. Сам по себе алгоритм жутко сырой, но идея, полагаю, понятна будет.
 

Вложения

  • poisk.rar
    1,7 KB · Просмотры: 2
Последнее редактирование:
В zip/tar пожалуйста. А то свинское отношение какое-то, выкладывать в .rar :conf:
 
В zip/tar пожалуйста. А то свинское отношение какое-то, выкладывать в .rar :conf:
Я пользуюсь ТОЛЬКО rar'ом, причем, наверное, на протяжении последних лет пятнадцати, как и все мои знакомые. Ничего свинского в этом не вижу. Но переархивировать не проблема, конечно.
 

Вложения

  • poisk.zip
    1,8 KB · Просмотры: 3
Свинство в использовании недокументированных форматов. Каким .rar и является. Проприетарщина как никак...
 
Свинство в использовании недокументированных форматов. Каким .rar и является. Проприетарщина как никак...
Для распаковки есть UnRAR с открытым исходным кодом и под все ОС...
Для просмотра ссылки Войди или Зарегистрируйся

Есть открытый 7-Zip, который умеет открывать RAR.
 
Если вы экономите вычислительный ресурс вашего кристалла, то язык наверное очень важен!
т.к не известно что может кушать ваша платформа.
Если действительно так важен ресурсы, то я бы делала на ассемлере, с базывыми прерываниями.
Без прерываний ос, и самостоятельно искала в памяти, это самый быстрый способ.
т.е написала бы функцию поиска по вхождению, делила мнимую строку в памяти на кусочки по вхождению,
тут же искала совпадения из маски, строка т.е кусок памяти остался целый.
маску наверное то же побила на кусочки.
Как-то так!
 
Если действительно так важен ресурсы, то я бы делала на ассемлере
Требовался алгоритм. То есть, программу определенно не собираются лепить на ассемблере - структура на нем будет сильно отличаться от любого ЯП высокого уровня.

Если же так важна скорость работы, рискну предположить, что вообще планируется использование медленных ИС, типа php или java.
 
Последнее редактирование:
Назад
Сверху