glob (программирование) - glob (programming)

редактировать

В компьютерном программировании шаблоны glob определяют наборы имен файлов с подстановочные знаки. Например, команда Unix Bash shell mv *.txt textfiles /перемещает (mv) все файлы с именами, заканчивающимися на .txtиз текущего каталога в каталог текстовых файлов. Здесь *- это подстановочный знак, обозначающий «любая строка символов», а *.txt- шаблон глобуса. Другой распространенный подстановочный знак - это вопросительный знак (?), который обозначает один символ.

Помимо сопоставления имен файлов, глобусы также широко используются для сопоставления произвольных строк (сопоставление с подстановочными знаками ). В этом качестве общим интерфейсом является fnmatch.

Contents
  • 1 Origin
  • 2 Syntax
    • 2.1 Unix-like
    • 2.2 Windows и DOS
    • 2.3 SQL
  • 3 По сравнению с регулярные выражения
    • 3.1 Реализация как регулярные выражения
  • 4 Реализации
  • 5 См. также
  • 6 Ссылки
Источник
Снимок экрана исходной справочной страницы Unix 1971 года для glob- владелец - dmr, сокращение от Деннис Ритчи.

. Команда glob, сокращение от global, происходит от самых ранних версий Bell Labs Unix. Командные интерпретаторы ранних версий Unix (с 1-го по 6-е выпуски, 1969–1975) полагались на отдельную программу для расширения подстановочных знаков в аргументах без кавычек команды: / etc / glob. Эта программа выполнила расширение и предоставила расширенный список путей к файлам для команды для выполнения.

Glob изначально был написан на языке программирования B. Это была первая часть основного программного обеспечения Unix, разработанная на языке программирования высокого уровня. Позже эта функциональность была предоставлена ​​в виде библиотечной функции C , glob (), используемой такими программами, как оболочка. Обычно он определяется на основе функции fnmatch (), которая проверяет, соответствует ли строка заданному шаблону. Обе функции являются частью POSIX : функции, определенные в POSIX.1 с 2001 года, и синтаксис, определенный в POSIX.2. Идея определения отдельной функции сопоставления началась с wildmat (сопоставление с подстановочными знаками), простой библиотеки для сопоставления строк с глобусами Bourne Shell.

Традиционно глобусы не соответствуют скрытым файлам в виде файлов точек Unix ; чтобы соответствовать им, шаблон должен явно начинаться с .. Например, *соответствует всем видимым файлам, а . *соответствует всем скрытым файлам.

Синтаксис

Наиболее распространенными подстановочными знаками являются *, ?и […].

Подстановочный знакОписаниеПримерСоответствуетНе соответствует
*соответствует любому количеству любых символов, включая отсутствиеПравил *Правил, Правилили ЮристGrokLaw, Laили aw
* Law *Law, GrokLawили Lawyer.Laили aw
?соответствует любому одиночному символу? atCat, cat, Batили batat
[abc]соответствует одному символу, указанному в скобках[CB] вCatили Batcatили bat
[az]соответствует одному символу из (зависящего от языкового стандарта) диапазона, указанного в скобкаLetter [0-9]Letter0, Letter1, Letter2до Letter9Letters, Letterили Letter10

Во всех случаях символ разделителя пути (/в Unix или \в Windows) никогда не будет совпадать.

Unix-like

В Unix-подобных системах *, ?определяется, как указано выше, тогда как […]имеет два дополнительных значения:

Подстановочный знакОписаниеПримерСоответствуетНе соответствует
[! Abc]соответствует одному символу, который не указан в квадратная скобка[! C] вBat, batили catCat
[! az]соответствует одному символу, который является не из диапазона, указанного в скобкахLetter [! 3-5]Letter1, Letter2, Letter6до Letter9и Letterxи т. д.Letter3, Letter4, Letter5или Letterxx

В диапазоны также могут входить предопределенные классы символов, классы эквивалентности для акцентированных символов, и символы сортировки для трудно вводимых символов. Они определены так, чтобы соответствовать скобкам в регулярных выражениях POSIX.

Подстановка подстановок Unix обрабатывается оболочкой в соответствии с традициями POSIX. Подстановка имен файлов обеспечивается в командной строке и в сценариях оболочки. Утвержденный POSIX оператор caseв оболочках обеспечивает сопоставление шаблонов с использованием глобальных шаблонов.

Некоторые оболочки (например, оболочка C и Bash ) поддерживают дополнительный синтаксис, известный как чередование или расширение скобок. Поскольку он не является частью синтаксиса glob, он не предоставляется в case. Он раскрывается только в командной строке перед подстановкой.

Оболочка Bash также поддерживает следующие расширения:

  • Расширенная подстановка (extglob): позволяет использовать другие операторы сопоставления с образцом для сопоставления нескольких вхождений образца, заключенного в круглые скобки, по существу обеспечивая отсутствующий Клини звезда и альтернатива для описания обычных языков. Его можно включить, установив параметр оболочки extglob. Такой вариант пришел от кш93. GNU fnmatch и glob имеют одинаковое расширение.
  • globstar: позволяет **самостоятельно в качестве компонента имени рекурсивно сопоставлять любое количество уровней нескрытых каталогов. Также поддерживается библиотеками JS и Python glob.

Windows и DOS

Команда dir с шаблоном glob в IBM PC DOS

оболочках Windows в соответствии с DOS традиционно не выполняют никакого раскрытия глобуса в аргументах, передаваемых во внешние программы. Оболочки могут использовать расширение для своих собственных встроенных команд:

  • Windows PowerShell имеет весь общий синтаксис, определенный, как указано выше, без каких-либо дополнений.
  • COMMAND.COM и cmd.exe имеют большую часть общего синтаксиса с некоторыми ограничениями: не существует […], а для COMMAND.COM *может появляться только в конце шаблона, но не в начале.

Программы Windows и DOS получают длинную строку командной строки вместо параметров в стиле argv, и в их обязанности входит выполнение любого разделения, цитирования или раскрытия глобуса. Технически не существует фиксированного способа описания подстановочных знаков в программах, поскольку они могут делать то, что хотят. Два общих модуля расширения включают:

  • Модуль расширения командной строки Microsoft C Runtime (msvcrt), который поддерживает только ?и *. И ReactOS (crt / misc / getargs.c), и Wine (msvcrt / data.c) содержат совместимую реализацию с открытым исходным кодом __getmainargs, функции работают под капотом, в их ядре CRT.
  • Cygwin и MSYS dcrt0.ccрасширитель командной строки, который использует unix-style glob ()внутренняя подпрограмма после разделения аргументов.

Большинство других частей Windows, включая службу индексирования, используют подстановочные знаки в стиле MS-DOS, найденные в CMD. Этот синтаксис, являющийся пережитком возраста файлов 8.3, уделяет особое внимание точкам в шаблоне и тексте (имя файла). Внутренне это делается с помощью трех дополнительных подстановочных знаков, <>". На стороне Windows API эквивалентом glob () является FindFirstFile, а fnmatch () соответствует его базовому RtlIsNameInExpression. (Другой аналог fnmatch - PathMatchSpec.) Оба модуля расширения msvcrt с открытым исходным кодом используют FindFirstFile, поэтому в них также будут применяться особенности имен файлов 8.3.

SQL

Оператор SQL LIKEимеет эквивалент ?и *, но не […].

Общий подстановочный знакПодстановочный знак SQLОписание
?_соответствует любому одиночному символу
*%соответствует любому количеству любых символов, включая ни одного

Стандартное использование SQL синтаксис типа glob для простого сопоставления строк в его операторе LIKE, хотя термин «glob» обычно не используется в сообществе SQL. Знак процента (%) соответствует нулю или более символам, а знак подчеркивания (_) соответствует ровно одному.

Многие реализации SQL расширили оператор LIKE, чтобы обеспечить более богатый язык сопоставления с образцом, включая диапазоны символов ([…]), их отрицание и элементы. регулярных выражений.

По сравнению с регулярными выражениями

Globs не включают синтаксис для звезды Kleene, которая допускает многократное повторение предыдущей части выражения; таким образом, они не считаются регулярными выражениями, которые могут описывать полный набор регулярных языков в любом заданном конечном алфавите.

Общий подстановочный знакЭквивалентное регулярное выражение
?.
*.*

Globs пытается сопоставить всю строку (например, S *.DOCсоответствует S.DOC и SA.DOC, но не POST.DOC или SURREY.DOCKS), тогда как, в зависимости от деталей реализации, регулярные выражения могут соответствовать подстроке.

Реализация как регулярные выражения

Исходная реализация Mozilla proxy auto-config, которая обеспечивает функцию сопоставления глобусов для строк, использует реализацию replace-as-RegExp как над. Синтаксис скобок в таком примере покрывается регулярным выражением.

Python fnmatch использует более сложную процедуру для замены шаблона на регулярное выражение.

Реализации

Помимо использования в оболочках, шаблоны глобусов также находят применение во множестве языки программирования, в основном для обработки человеческого ввода. Интерфейс в стиле glob для возврата файлов или интерфейс в стиле fnmatch для сопоставления строк можно найти в следующих языках программирования:

  • D имеет функцию globMatchв модуле std.path.
  • JavaScript имеет библиотеку под названием minimatch, которая используется внутри npm, и micromatch, предположительно более оптимизированным, точным и безопасным глобусом. реализация, используемая babel и yarn.
  • Go имеет функцию Globв пакете filepath.
  • Java имеет Filesкласс, содержащий методы, которые работают с шаблонами глобусов.
  • Haskell имеет пакет Globс основным модулем System.FilePath.Glob. Синтаксис шаблона основан на подмножестве Zsh. Он пытается оптимизировать данный шаблон и должен быть заметно быстрее, чем простое посимвольное сопоставление.
  • Perl имеет обе функции glob(как обсуждается в Larry Wall книги Программирование Perl ) и расширение Glob, которое имитирует процедуру BSD glob. Угловые скобки Perl также можно использовать для подстановки: <*.log>.
  • PHP имеет функцию glob.
  • Python имеет модуль globв стандартной библиотеке который выполняет сопоставление шаблонов с подстановочными знаками в именах файлов, и модуль fnmatchс функциями сопоставления строк или списков фильтрации на основе тех же шаблонов подстановочных знаков. Гвидо ван Россум, автор языка программирования Python, написал и предоставил подпрограмму globдля BSD Unix в 1986 году. Существовали предыдущие реализации glob, например, в и ftp в предыдущих выпусках BSD.
  • Ruby имеет метод globдля класса Dir, который выполняет сопоставление шаблонов с подстановочными знаками в именах файлов. Некоторые библиотеки, такие как Rant и Rake, предоставляют класс FileList, который имеет метод glob или использует метод FileList.идентично.
  • SQLite имеет функцию GLOB.
  • Tcl содержит средство подстановки.
См. Также
Ссылки
Последняя правка сделана 2021-05-21 10:45:36
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте