wildmat — это библиотека сопоставления шаблонов, разработанная Ричем Сальцем . Основанная на синтаксисе подстановочных знаков, который уже использовался в оболочке Bourne , wildmat обеспечивает единый механизм сопоставления шаблонов в приложениях с более простым синтаксисом, чем тот, который обычно предлагают регулярные выражения . Шаблоны неявно прикрепляются в начале и конце каждой строки при проверке на соответствие.
В июне 2019 года Рич Сальц опубликовал оригинальную версию ныне несуществующей библиотеки на GitHub в рамках передачи в общественное достояние . [1]
Операции сопоставления с образцом
Помимо строгого однозначного соответствия между шаблоном и источником, проверяемым на совпадение, существует пять операций сопоставления с образцом.
Звездочка ( * ) соответствует любой последовательности из нуля или более символов.
Вопросительный знак ( ? ) соответствует любому отдельному символу.
Набор указанных символов. Он указывается как список символов или как диапазон символов, где начало и конец диапазона разделены знаком минус (или тире), или как любая комбинация списков и диапазонов. Тире также может быть включено в набор как символ, если оно является началом или концом набора. Этот набор заключен в квадратные скобки. Закрывающая квадратная скобка (]) может использоваться в наборе, если это первый символ в наборе.
Отрицание множества. Оно указывается так же, как и множество, с добавлением символа вставки (^) в начале тестовой строки, прямо внутри открытой квадратной скобки. (NNTP указывает альтернативу !. Реализацию можно настроить на выполнение любого из этих вариантов.)
Символ обратной косой черты ( \ ) для аннулирования специального значения открытой квадратной скобки ([), звездочки, обратной косой черты или вопросительного знака. Два обратных слеша подряд приведут к оценке обратной косой черты как символа без специального значения.
Примеры
*foo* соответствует строке, содержащей «foo».
mini* соответствует всему, что начинается с «mini» (включая саму строку «mini»).
???* соответствует любой строке из трех и более букв.
[^]-] соответствует символу, отличному от закрывающей квадратной скобки или тире.
Использование
wildmat чаще всего встречается в реализациях NNTP , таких как собственный INN Зальца , а также в неродственном программном обеспечении, таком как GNU tar и Transmission . GNU tar заменил wildmat на POSIX fnmatch glob matcher в сентябре 1992 года. Ранняя версия содержала потенциальный доступ за пределы диапазона для незакрытых [ . [2]
Исходная реализация wildmat, ориентированная на байты, не может обрабатывать многобайтовые наборы символов и создает проблемы, когда искомый текст может содержать несколько несовместимых наборов символов. Упрощенная версия wildmat, ориентированная на кодировку UTF-8, была разработана рабочей группой IETF NNTP. Она является частью RFC 3977 (раздел 4), стандарта 2006 года для NNTP.
В новой версии INN, которая поддерживает UTF-8, был добавлен "uwildmat", который поддерживает все возможности wildmat. Эта переделка 2000 года, выполненная Рассом Олбери, исправляет OOB в исходной реализации. Плотно закрученные циклы C были записаны в меньшие операторы. [3] [4]
Rsync включает в себя потомка wildmat с лицензией GPLv3, известного как wildmatch, модифицированного Уэйном Дэвисоном. Система контроля версий Git импортирует и использует его. Он не поддерживает UTF-8, но имеет фиксированный OOB и дополнительную поддержку для классов символов и звездных глобусов (** для произвольной глубины). [5]
^ Salz, Rich (25 июня 2019 г.). "wildmat: старинный классический сопоставитель шаблонов wildmat; общественное достояние". GitHub . Получено 25 ноября 2019 г. .
^ Salz, Rich (25 июня 2019 г.). "wildmat.c". GitHub . Может оказаться ненадёжным при наличии неправильно сформированных шаблонов; например, "foo[a-" может вызвать нарушение сегментации.
^ "uwildmat.c в trunk/lib – INN". inn.eyrie.org . Получено 27 ноября 2019 г. .
^ "git/git: wildmatch.c". GitHub . 16 февраля 2022 г.
Внешние ссылки
Рич Зальц (4 апреля 1991 г.). «v17i079: wildmat-1.4 — средство сопоставления шаблонов в стиле /bin/sh, часть 01/01». Группа новостей : comp.sources.misc. Usenet: 4 апреля 1991 г., 034350.3923@sparky.IMD.Sterling.COM.
Rich Salz (9 марта 1991 г.). "v17i034: wildmat - сопоставитель шаблонов в стиле /bin/sh, часть 01/01". Группа новостей : comp.sources.misc. Usenet: 1991Mar9.044016.2409@sparky.IMD.Sterling.COM.