Введение

Библиотека сопоставления шаблонов, разработанная Ричем Сальцем. wildmat — это библиотека сопоставления шаблонов, разработанная Ричем Сальцем. Основываясь на синтаксисе подстановочных знаков, уже используемом в оболочке Bourne, wildmat предоставляет единый механизм сопоставления шаблонов в различных приложениях с более простым синтаксисом, чем обычно используется в регулярных выражениях. При проверке соответствия шаблоны неявно привязаны к началу и концу каждой строки. В июне 2019 года Рич Сальц опубликовал исходную версию библиотеки, которая больше не поддерживается, на GitHub под лицензией, передающей её в общественное достояние.

Операции сопоставления образцов

Существует пять операций сопоставления с образцом, помимо строгого соответствия один к одному между образцом и проверяемым источником. Звездочка (*) соответствует любой последовательности из нуля или более символов. Знак вопроса (?) соответствует любому одиночному символу. Набор указанных символов. Он задается как список символов или как диапазон символов, где начало и конец диапазона разделены знаком минус (или дефисом), или как любая комбинация списков и диапазонов. Дефис также может быть включен в набор как символ, если он является первым или последним символом в наборе. Этот набор заключен в квадратные скобки. Закрывающая квадратная скобка (]) может быть использована в наборе, если она является первым символом в наборе. Отрицание набора. Он задается так же, как и набор, с добавлением символа каретки (^) в начале строки тестирования сразу после открывающей квадратной скобки. (NNTP определяет альтернативный вариант – восклицательный знак (!). Реализация может быть настроена на использование любого из этих вариантов.) Обратная косая черта (\) используется для отмены специального значения открывающей квадратной скобки ([), звездочки, обратной косой черты или знака вопроса. Две последовательные обратные косые черты приводят к тому, что обратная косая черта интерпретируется как символ без специального значения.

Примеры

*foo* соответствует строке, содержащей "foo". mini* соответствует любой строке, начинающейся с "mini" (включая саму строку "mini"). ? ?? * соответствует любой строке из трех и более символов. [0-9a-zA-Z] соответствует любому алфавитно-цифровому символу ASCII. [^]] соответствует символу, отличному от закрывающей квадратной скобки или дефиса.

Использование

wildmat чаще всего встречается в реализациях NNTP, таких как INN, разработанная самим Salz, а также в несвязанном программном обеспечении, например GNU tar и Transmission. В сентябре 1992 года GNU tar заменила wildmat на сопоставление шаблонов fnmatch, соответствующее стандарту POSIX. Ранняя версия содержала потенциальную ошибку выхода за границы выделенной памяти. Оригинальная байт-ориентированная реализация wildmat не способна обрабатывать многобайтовые кодировки и вызывает проблемы, когда искомый текст может содержать несколько несовместимых наборов символов. Рабочая группа IETF NNTP разработала упрощенную версию wildmat, ориентированную на кодировку UTF-8. Она является частью (раздел 4) стандарта NNTP 2006 года. В более новой версии INN, поддерживающей UTF-8, был добавлен "uwildmat", который поддерживает все возможности wildmat. Эта переработка 2000 года, выполненная Рассом Олберри, устраняет ошибку выхода за границы памяти в оригинальной реализации. Сложные циклы на C были разбиты на более простые операторы. Rsync включает в себя потомка wildmat, лицензированного по GPLv3 и известного как wildmatch, модифицированного Уэйном Дэвисоном. Система контроля версий Git импортирует и использует его. Он не поддерживает UTF-8, но в нем исправлена ошибка выхода за границы памяти и добавлена поддержка классов символов и шаблонов с использованием двойной звездочки ( ** ) для произвольной глубины вложенности.