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

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:
 
Последнее редактирование:

Duke_Cheb

Создатель
Регистрация
23 Янв 2014
Сообщения
43
Реакции
21
Маска типа example.*ws не рассматривается? (То есть, с произвольным блоком внутри запроса).
 

Duke_Cheb

Создатель
Регистрация
23 Янв 2014
Сообщения
43
Реакции
21
Хм... Без подключения библиотек, алгоритм пугающий получается. Семантический разбор строки - вообще штука очень рутинная.

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

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

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

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

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

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

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

Вложения

  • poisk.rar
    1,7 KB · Просмотры: 2
Последнее редактирование:

Sorcus

Sorcus. A New Beginning.
Регистрация
10 Июл 2011
Сообщения
513
Реакции
1.002
В zip/tar пожалуйста. А то свинское отношение какое-то, выкладывать в .rar :conf:
 

Duke_Cheb

Создатель
Регистрация
23 Янв 2014
Сообщения
43
Реакции
21
В zip/tar пожалуйста. А то свинское отношение какое-то, выкладывать в .rar :conf:
Я пользуюсь ТОЛЬКО rar'ом, причем, наверное, на протяжении последних лет пятнадцати, как и все мои знакомые. Ничего свинского в этом не вижу. Но переархивировать не проблема, конечно.
 

Вложения

  • poisk.zip
    1,8 KB · Просмотры: 3

Sorcus

Sorcus. A New Beginning.
Регистрация
10 Июл 2011
Сообщения
513
Реакции
1.002
Свинство в использовании недокументированных форматов. Каким .rar и является. Проприетарщина как никак...
 

latteo

Эффективное использование PHP, MySQL
Регистрация
27 Фев 2008
Сообщения
1.603
Реакции
1.565
Свинство в использовании недокументированных форматов. Каким .rar и является. Проприетарщина как никак...
Для распаковки есть UnRAR с открытым исходным кодом и под все ОС...
Для просмотра ссылки Войди или Зарегистрируйся

Есть открытый 7-Zip, который умеет открывать RAR.
 

Oxana77

Создатель
Регистрация
18 Окт 2016
Сообщения
20
Реакции
10
Если вы экономите вычислительный ресурс вашего кристалла, то язык наверное очень важен!
т.к не известно что может кушать ваша платформа.
Если действительно так важен ресурсы, то я бы делала на ассемлере, с базывыми прерываниями.
Без прерываний ос, и самостоятельно искала в памяти, это самый быстрый способ.
т.е написала бы функцию поиска по вхождению, делила мнимую строку в памяти на кусочки по вхождению,
тут же искала совпадения из маски, строка т.е кусок памяти остался целый.
маску наверное то же побила на кусочки.
Как-то так!
 

Duke_Cheb

Создатель
Регистрация
23 Янв 2014
Сообщения
43
Реакции
21
Если действительно так важен ресурсы, то я бы делала на ассемлере
Требовался алгоритм. То есть, программу определенно не собираются лепить на ассемблере - структура на нем будет сильно отличаться от любого ЯП высокого уровня.

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