wildmat — это библиотека сопоставления шаблонов, разработанная Ричем Сальцем . Основанная на синтаксисе подстановочных знаков, который уже использовался в оболочке Bourne , wildmat обеспечивает единый механизм сопоставления шаблонов в приложениях с более простым синтаксисом, чем тот, который обычно предлагают регулярные выражения . Шаблоны неявно прикрепляются в начале и конце каждой строки при проверке на соответствие.
В июне 2019 года Рич Сальц опубликовал оригинальную версию ныне несуществующей библиотеки на GitHub в рамках передачи в общественное достояние . [1]
Помимо строгого однозначного соответствия между шаблоном и источником, проверяемым на совпадение, существует пять операций сопоставления с образцом.
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]
Может оказаться ненадёжным при наличии неправильно сформированных шаблонов; например, "foo[a-" может вызвать нарушение сегментации.