Минимальная утилита сопоставления.
Это соответствующая библиотека, используемая внутри npm.
Он работает путем преобразования выражений glob в объекты JavaScript RegExp
.
// гибридный модуль, загрузка с помощью require() или importimport { minimatch } from 'minimatch'// или:const { minimatch } = require('minimatch')minimatch('bar.foo', '*.foo') // true!minimatch('bar.foo', '*.bar') // false!minimatch('bar.foo', '*.+(bar|foo)', { debug: true }) // правда и шумно!
Поддерживает следующие функции glob:
Расширение скобок
Расширенное сопоставление глобальных объектов
«Глобстар» **
соответствие
Классы символов Posix, такие как [[:alpha:]]
, поддерживающие полный диапазон символов Юникода. Например, [[:alpha:]]
будет соответствовать 'é'
, а [a-zA-Z]
— нет. Сопоставление символов и наборов не поддерживается, поэтому [[=e=]]
не будет соответствовать 'é'
, а [[.ch.]]
не будет соответствовать 'ch'
в локалях, где ch
считается одним символом.
Видеть:
man sh
man bash
Сопоставление с образцом
man 3 fnmatch
man 5 gitignore
Пожалуйста, используйте только косую черту в глобальных выражениях.
Хотя Windows использует /
или в качестве разделителя пути, в этой реализации glob используются только символы /
. Вы должны использовать косую черту только в глобальных выражениях. Обратные косые черты в шаблонах всегда будут интерпретироваться как escape-символы, а не как разделители путей.
Обратите внимание, что или /
будет интерпретироваться как разделитель путей в путях в Windows и будет соответствовать /
в выражениях glob.
Поэтому всегда используйте /
в шаблонах.
В Windows пути UNC, такие как //?/c:/...
или //ComputerName/Share/...
обрабатываются особым образом.
Шаблоны, начинающиеся с двойной косой черты, за которой следуют некоторые символы без косой черты, сохранят двойную косую черту. В результате шаблон типа //*
будет соответствовать //x
, но не /x
.
Шаблоны, начинающиеся с //?/<drive letter>:
не будут обрабатывать ?
как подстановочный знак. Вместо этого он будет рассматриваться как обычная строка.
Шаблоны, начинающиеся с //?/<drive letter>:/...
будут соответствовать путям к файлам, начинающимся с <drive letter>:/...
, и наоборот, как если бы //?/
не было. Такое поведение наблюдается только в том случае, если буквы дисков совпадают друг с другом без учета регистра. Остальные части пути/шаблона сравниваются с учетом регистра, если не установлено nocase:true
.
Обратите внимание, что указание пути UNC с использованием символов в качестве разделителей пути всегда разрешено в аргументе пути к файлу, но допускается только в аргументе шаблона, если в параметрах установлено значение windowsPathsNoEscape: true
.
Создайте объект minimatch, создав экземпляр класса minimatch.Minimatch
.
var Minimatch = require('minimatch').Minimatchvar mm = новый Minimatch(шаблон, параметры)
pattern
Исходный шаблон, который представляет объект мини-соответствия.
options
Параметры, предоставляемые конструктору.
set
Двумерный массив регулярных выражений или строковых выражений. Каждая строка массива соответствует шаблону, развернутому скобками. Каждый элемент в строке соответствует одной части пути. Например, шаблон {a,b/c}/d
будет расширен до набора таких шаблонов:
[ [ a, d ] , [ b, c, d ] ]
Если часть шаблона не содержит в себе никакой «магии» (то есть это что-то вроде "foo"
а не fo*o?
), то она останется в виде строки, а не будет преобразована в регулярное выражение.
regexp
Создается методом makeRe
. Одно регулярное выражение, выражающее весь шаблон. Это полезно в тех случаях, когда вы хотите использовать шаблон, подобный fnmatch(3)
с включенным FNM_PATH
.
negate
Истинно, если шаблон отрицается.
comment
Истинно, если шаблон является комментарием.
empty
True, если шаблон равен ""
.
makeRe()
При необходимости сгенерируйте член regexp
и верните его. Вернет false
если шаблон недействителен.
match(fname)
Возвращает true, если имя файла соответствует шаблону, или false в противном случае.
matchOne(fileArray, patternArray, partial)
Возьмите /
-разделенное имя файла и сопоставьте его с одной строкой в regExpSet
. Этот метод в основном предназначен для внутреннего использования, но он доступен для использования glob-walker, которому необходимо избегать чрезмерных вызовов файловой системы.
hasMagic()
Возвращает true, если анализируемый шаблон содержит какие-либо магические символы. Возвращает false, если все части компаратора являются строковыми литералами. Если в конструкторе установлена опция magicalBraces
, то расширения фигурных скобок, которые иначе не являются волшебными, будут считаться волшебными. Если не установлено, то шаблон типа a{b,c}d
вернет false
, поскольку ни abd
, ни acd
не содержат никаких специальных символов.
Это не означает, что строку шаблона можно использовать в качестве буквального имени файла, поскольку она может содержать экранированные магические символы. Например, шаблон *
или [*]
не будет считаться магическим, поскольку совпадающая часть анализируется до буквальной строки '*'
и будет соответствовать пути с именем '*'
, а не '*'
или '[*]'
. Метод minimatch.unescape()
можно использовать для удаления escape-символов.
Все остальные методы являются внутренними и будут вызываться по мере необходимости.
Основной экспорт. Проверяет путь на соответствие шаблону, используя параметры.
var isJS = minimatch(file, '*.js', { matchBase: true })
Возвращает функцию, проверяющую предоставленный ей аргумент, подходящую для использования с Array.filter
. Пример:
вар javascripts = fileList.filter(minimatch.filter('*.js', { matchBase: true }))
Экранируйте все магические символы в шаблоне glob, чтобы он всегда соответствовал только буквальным строкам.
Если используется опция windowsPathsNoEscape
, то символы экранируются путем переноса в []
, поскольку магический символ, заключенный в класс символов, может соответствовать только этому конкретному символу.
Косая черта (и обратная косая черта в режиме windowsPathsNoEscape
) не может быть экранирована или неэкранирована.
Отмените экранирование строки glob, которая может содержать некоторые экранированные символы.
Если используется опция windowsPathsNoEscape
, то удаляются квадратные скобки, но не обратная косая черта. Например, он превратит строку '[*]'
в *
, но не превратит '*'
в '*'
, поскольку это разделитель путей в режиме windowsPathsNoEscape
.
Если windowsPathsNoEscape
не установлен, то удаляются как экранные скобки, так и символы обратной косой черты.
Косая черта (и обратная косая черта в режиме windowsPathsNoEscape
) не может быть экранирована или неэкранирована.
Сопоставление со списком файлов в стиле fnmatch или glob. Если ничего не найдено и установлен options.nonull, верните список, содержащий сам шаблон.
вар javascripts = minimatch.match(fileList, '*.js', { matchBase: true })
Создайте объект регулярного выражения на основе шаблона.
По умолчанию все параметры являются false
.
Выгрузить тонну данных в stderr.
Не расширяйте наборы фигурных скобок {a,b}
и {1..3}
.
Отключите сопоставление **
для нескольких имен папок.
Разрешить шаблонам соответствовать именам файлов, начинающимся с точки, даже если в шаблоне точка в этом месте явно не указана.
Обратите внимание, что по умолчанию a/**/b
не будет соответствовать a/.d/b
, если не установлена dot
.
Отключите шаблоны стиля «extglob», такие как +(a|b)
.
Выполните сопоставление без учета регистра.
При использовании с {nocase: true}
создавайте регулярные выражения, нечувствительные к регистру, но оставляйте части, соответствующие строке, нетронутыми. Не имеет эффекта при использовании без {nocase: true}
Полезно, когда используется какая-либо другая форма сопоставления без учета регистра или если исходное строковое представление полезно каким-либо другим образом.
Если minimatch.match
не находит совпадения, верните список, содержащий сам шаблон, если эта опция установлена. Если этот параметр не установлен, при отсутствии совпадений возвращается пустой список.
Это влияет только на результаты метода Minimatch.hasMagic
.
Если шаблон содержит расширения фигурных скобок, такие как a{b,c}d
, но не содержит других магических символов, то метод Minimatch.hasMagic()
по умолчанию вернет false
. Если эта опция установлена, она вернет true
для раскрытия фигурных скобок, а также для других символов магических глобусов.
Если установлено, то шаблоны без косой черты будут сопоставляться с базовым именем пути, если оно содержит косую черту. Например, a?b
будет соответствовать пути /xyz/123/acb
, но не /xyz/acb/123
.
Подавить обработку #
в начале шаблона как комментария.
Подавить поведение лечения ведущего !
характер как отрицание.
Возвращает отрицательные выражения так же, как если бы они не были отрицательными. (То есть, true при попадании, false при промахе.)
Сравните частичный путь с шаблоном. Пока присутствующие части пути не противоречат шаблону, они будут рассматриваться как совпадения. Это полезно в приложениях, где вы просматриваете структуру папок и еще не имеете полного пути, но хотите убедиться, что вы не идете по путям, которые никогда не могут совпадать.
Например,
minimatch('/a/b', '/a/*/c/d', { parts: true }) // true, может быть /a/b/c/dminimatch('/a/b', '/ **/d', { частичное: true }) // истинно, может быть /a/b/.../dminimatch('/x/y/z', '/a/**/z', { частичное : true }) // false, потому что x !== а
Используйте только в качестве разделителя пути и никогда в качестве escape-символа. Если установлено, все символы
заменяются на
/
в шаблоне. Обратите внимание, что это делает невозможным сопоставление путей, содержащих буквальные символы шаблона glob, но позволяет сопоставлять шаблоны, созданные с помощью path.join()
и path.resolve()
на платформах Windows, имитируя (ошибочное!) поведение более ранних версий в Windows. . Пожалуйста, используйте с осторожностью и помните о путях Windows.
По причинам наследия это также устанавливается, если для options.allowWindowsEscape
установлено точное значение false
.
Если шаблон начинается с UNC-пути или буквы диска и находится в режиме nocase:true
, не преобразуйте корневые части шаблона в регулярное выражение без учета регистра, а оставляйте их в виде строк.
Это значение по умолчанию, если используется платформа win32
и установлено nocase:true
.
По умолчанию несколько символов /
(кроме начального //
в пути UNC, см. «Пути UNC» выше) рассматриваются как один /
.
То есть шаблон типа a///b
будет соответствовать пути к файлу a/b
.
Установите preserveMultipleSlashes: true
, чтобы подавить это поведение.
Число, указывающее уровень оптимизации, которую следует выполнить с шаблоном перед анализом и использованием его для сопоставлений.
Части Globstar **
всегда преобразуются в *
если установлен noglobstar
, и несколько соседних частей **
преобразуются в одну **
(т. е. a/**/**/b
будет рассматриваться как a/**/b
, поскольку это эквивалентно во всех случаях).
0
— больше не вносить изменений. В этом режиме .
и ..
сохраняются в шаблоне, а это означает, что они также должны появляться в одной и той же позиции в строке пути теста. Например, шаблон типа a/*/../c
будет соответствовать строке a/b/../c
, но не строке a/c
.
1
— (по умолчанию) Удалить случаи, когда двойная точка ..
следует за частью шаблона, отличной от **
, .
, ..
или пусто ''
. Например, шаблон ./a/b/../*
преобразуется в ./a/*
и поэтому он будет соответствовать строке пути ./a/c
, но не строке пути ./a/b/../c
. Точки и пустые части контура в шаблоне сохраняются.
2
(или выше) — гораздо более агрессивная оптимизация, подходящая для использования в случаях обхода файлов:
Хотя эти оптимизации улучшают производительность в сценариях использования файлов, таких как glob (т. е. причина существования этого модуля), существуют случаи, когда он не может сопоставить литеральную строку, которая была бы сопоставлена на уровне оптимизации 1 или 0.
В частности, хотя метод Minimatch.match()
оптимизирует строку пути к файлу теми же способами, что приводит к тем же совпадениям, он завершится неудачно при тестировании с регулярным выражением, предоставленным Minimatch.makeRe()
, если только строка пути не будет первой. обрабатывается с помощью minimatch.levelTwoFileOptimize()
или аналогичного.
Удалите случаи, когда двойная точка ..
следует за частью шаблона, отличной от **
, .
или пустой ''
. Удалить пустые и .
части шаблона, где это безопасно (т. е. где угодно, кроме последней позиции, первой позиции или второй позиции в шаблоне, начинающемся с /
, поскольку это может указывать путь UNC в Windows).
Преобразование шаблонов, содержащих <pre>/**/../<p>/<rest>
в эквивалентный <pre>/{..,**}/<p>/<rest>
, где <p>
— это шаблон часть кроме .
, ..
, **
или пусто ''
.
Шаблоны дедупликации, в которых часть **
присутствует в одном и опущена в другом, и это не конечная часть пути, а в остальном они эквивалентны. Таким образом {a/**/b,a/b}
становится a/**/b
, потому что **
соответствует пустой части пути.
Шаблоны дедупликации, в которых присутствует часть *
, а также шаблон без точек, отличный от **
, .
, ..
или ''
находится в том же положении в другом. Таким образом, a/{*,x}/b
становится a/*/b
, потому что *
может соответствовать x
.
Если установлено значение win32
, это вызовет все специфичные для Windows действия (специальная обработка путей UNC и обработка разделителей в путях к файлам для сравнения).
По умолчанию используется process.platform
.
Хотя строгое соблюдение существующих стандартов является целесообразной целью, между minimatch и другими реализациями существуют некоторые расхождения. Некоторые из них являются преднамеренными, а некоторые неизбежны.
Если шаблон начинается с !
символ, то он отрицается. Установите флаг nonegate
, чтобы подавить такое поведение, и обработайте ведущий !
персонажи в норме. Возможно, это актуально, если вы хотите начать шаблон с отрицательного шаблона extglob, например !(a|B)
. Несколько !
символы в начале шаблона несколько раз будут инвертировать шаблон.
Если шаблон начинается с #
, он рассматривается как комментарий и не будет ничему соответствовать. Используйте #
, чтобы соответствовать литералу #
в начале строки, или установите флаг nocomment
, чтобы подавить это поведение.
Символ двойной звезды **
поддерживается по умолчанию, если не установлен флаг noglobstar
. Это поддерживается аналогично bsdglob и bash 4.1, где **
имеет особое значение только в том случае, если он является единственным элементом в части пути. То есть a/**/b
будет соответствовать a/x/y/b
, а a/**b
— нет.
Если экранированный шаблон не имеет совпадений и установлен флаг, nonull
, то minimatch.match возвращает шаблон в том виде, в котором он был предоставлен, вместо того, чтобы интерпретировать escape-символы. Например, minimatch.match([], "*a?")
вернет "*a?"
вместо "*a?"
. Это похоже на установку параметра nullglob
в bash, за исключением того, что он не разрешает экранированные символы шаблона.
Если расширение фигурных скобок не отключено, оно выполняется перед любой другой интерпретацией шаблона glob. Таким образом, шаблон типа +(a|{b),c)}
, который недопустим в bash или zsh, сначала расширяется до набора +(a|b)
и +(a|c)
, и эти шаблоны проверяются на валидность. Поскольку эти два значения действительны, сопоставление продолжается.
Отрицательные шаблоны extglob обрабатываются максимально близко к семантике Bash, но в некоторых случаях отрицательные extglob чрезвычайно сложно выразить в регулярном выражении JavaScript. В частности, отрицательный шаблон <start>!(<pattern>*|)*
будет в bash соответствовать всему, что не начинается с <start><pattern>
. Однако <start>!(<pattern>*)*
будет соответствовать путям, начинающимся с <start><pattern>
, поскольку пустая строка может соответствовать отрицательной части. В этой библиотеке <start>!(<pattern>*|)*
не будет соответствовать ни одному шаблону, начинающемуся с <start>
из-за разницы в том, какие именно шаблоны считаются «жадными» в регулярных выражениях и расширении пути bash. Это можно исправить, но не без некоторых сложностей и снижения производительности, и этот компромисс, похоже, не стоит того, чтобы его искать.
Обратите внимание, что fnmatch(3)
в libc — чрезвычайно простой инструмент сравнения строк, который не делает ничего особенного для косых черт. Эта библиотека предназначена для использования в поиске по глобальным объектам и обходе файлов, поэтому она выполняет особые действия с /
. Таким образом, foo*
не будет соответствовать foo/bar
в этой библиотеке, хотя в fnmatch(3)
оно будет соответствовать.