Un utilitaire de correspondance minimal.
Il s'agit de la bibliothèque correspondante utilisée en interne par npm.
Il fonctionne en convertissant les expressions globales en objets JavaScript RegExp
.
// module hybride, chargé avec require() ou importimport { minimatch } from 'minimatch'// ou:const { minimatch } = require('minimatch')minimatch('bar.foo', '*.foo') // true!minimatch('bar.foo', '*.bar') // false!minimatch('bar.foo', '*.+(bar|foo)', { debug: true }) // vrai, et bruyant !
Prend en charge ces fonctionnalités globales :
Expansion du renfort
Correspondance globale étendue
"Globstar" **
correspondant
Classes de caractères Posix, comme [[:alpha:]]
, prenant en charge la gamme complète de caractères Unicode. Par exemple, [[:alpha:]]
correspondra à 'é'
, mais [a-zA-Z]
ne le fera pas. Le regroupement des symboles et la correspondance des ensembles ne sont pas pris en charge, donc [[=e=]]
ne correspondra pas à 'é'
et [[.ch.]]
ne correspondra pas à 'ch'
dans les paramètres régionaux où ch
est considéré comme un caractère unique.
Voir:
man sh
man bash
man 3 fnmatch
man 5 gitignore
Veuillez utiliser uniquement des barres obliques dans les expressions globales.
Bien que Windows utilise /
ou comme séparateur de chemin, seuls les caractères /
sont utilisés par cette implémentation globale. Vous devez utiliser des barres obliques uniquement dans les expressions globales. Les barres obliques inverses dans les modèles seront toujours interprétées comme des caractères d'échappement et non comme des séparateurs de chemin.
Notez que ou /
sera interprété comme des séparateurs de chemin dans les chemins sous Windows et correspondra à /
dans les expressions globales.
Utilisez donc toujours /
dans les modèles.
Sous Windows, les chemins UNC comme //?/c:/...
ou //ComputerName/Share/...
sont gérés spécialement.
Les modèles commençant par une double barre oblique suivis de certains caractères autres que la barre oblique conserveront leur double barre oblique. Par conséquent, un modèle comme //*
correspondra //x
, mais pas à /x
.
Modèles commençant par //?/<drive letter>:
ne traiteront pas le ?
comme caractère générique. Au lieu de cela, elle sera traitée comme une chaîne normale.
Les modèles commençant par //?/<drive letter>:/...
correspondront aux chemins de fichiers commençant par <drive letter>:/...
, et vice versa, comme si le //?/
n'était pas présent. Ce comportement n’est présent que lorsque les lettres de lecteur ne respectent pas la casse les unes par rapport aux autres. Les parties restantes du chemin/modèle sont comparées en respectant la casse, à moins que nocase:true
ne soit défini.
Notez que la spécification d'un chemin UNC à l'aide de caractères comme séparateurs de chemin est toujours autorisée dans l'argument du chemin du fichier, mais uniquement autorisée dans l'argument du modèle lorsque windowsPathsNoEscape: true
est défini dans les options.
Créez un objet minimatch en instanciant la classe minimatch.Minimatch
.
var Minimatch = require('minimatch').Minimatchvar mm = new Minimatch(modèle, options)
pattern
Le modèle original représenté par l'objet minimatch.
options
Les options fournies au constructeur.
set
Un tableau à 2 dimensions d'expressions rationnelles ou de chaînes. Chaque ligne du tableau correspond à un modèle développé par accolades. Chaque élément de la ligne correspond à une seule partie de chemin. Par exemple, le modèle {a,b/c}/d
s'étendrait à un ensemble de modèles comme :
[ [ a, d ] , [ b, c, d ] ]
Si une partie du modèle ne contient aucune « magie » (c'est-à-dire quelque chose comme "foo"
plutôt que fo*o?
), alors elle sera laissée sous forme de chaîne plutôt que convertie en expression régulière.
regexp
Créé par la méthode makeRe
. Une seule expression régulière exprimant l’ensemble du modèle. Ceci est utile dans les cas où vous souhaitez utiliser le modèle un peu comme fnmatch(3)
avec FNM_PATH
activé.
negate
True si le modèle est annulé.
comment
Vrai si le modèle est un commentaire.
empty
Vrai si le modèle est ""
.
makeRe()
Générez le membre regexp
si nécessaire et renvoyez-le. Renvoie false
si le modèle n'est pas valide.
match(fname)
Renvoie true si le nom de fichier correspond au modèle, ou false sinon.
matchOne(fileArray, patternArray, partial)
Prenez un nom de fichier /
-split et faites-le correspondre à une seule ligne du regExpSet
. Cette méthode est principalement destinée à un usage interne, mais est exposée afin de pouvoir être utilisée par un glob-walker qui doit éviter les appels excessifs au système de fichiers.
hasMagic()
Renvoie vrai si le modèle analysé contient des caractères magiques. Renvoie false si toutes les parties du comparateur sont des chaînes littérales. Si l'option magicalBraces
est définie sur le constructeur, alors il considérera comme magiques les extensions d'accolades qui ne sont pas autrement magiques. S'il n'est pas défini, un modèle comme a{b,c}d
renverra false
, car ni abd
ni acd
ne contiennent de caractères globaux spéciaux.
Cela ne signifie pas que la chaîne de modèle peut être utilisée comme nom de fichier littéral, car elle peut contenir des caractères magiques globaux qui sont échappés. Par exemple, le modèle *
ou [*]
ne serait pas considéré comme magique, car la partie correspondante analyse la chaîne littérale '*'
et correspondrait à un chemin nommé '*'
, et non '*'
ou '[*]'
. La méthode minimatch.unescape()
peut être utilisée pour supprimer les caractères d'échappement.
Toutes les autres méthodes sont internes et seront appelées si nécessaire.
Principale exportation. Teste un chemin par rapport au modèle à l’aide des options.
var isJS = minimatch(fichier, '*.js', { matchBase : true })
Renvoie une fonction qui teste son argument fourni, adapté à une utilisation avec Array.filter
. Exemple:
var javascripts = fileList.filter(minimatch.filter('*.js', { matchBase: true }))
Échapper à tous les caractères magiques dans un modèle global, afin qu'il ne corresponde qu'aux chaînes littérales
Si l'option windowsPathsNoEscape
est utilisée, alors les caractères sont échappés en étant enveloppés dans []
, car un caractère magique enveloppé dans une classe de caractères ne peut être satisfait que par ce caractère exact.
Les barres obliques (et les barres obliques inverses en mode windowsPathsNoEscape
) ne peuvent pas être échappées ou non.
Annulez l'échappement d'une chaîne globale pouvant contenir des caractères d'échappement.
Si l'option windowsPathsNoEscape
est utilisée, les échappements par accolades carrées sont supprimés, mais pas les échappements par barre oblique inverse. Par exemple, il transformera la chaîne '[*]'
en *
, mais il ne transformera pas '*'
en '*'
, car il s'agit d'un séparateur de chemin en mode windowsPathsNoEscape
.
Lorsque windowsPathsNoEscape
n'est pas défini, les accolades d'échappement et les barres obliques inverses sont supprimées.
Les barres obliques (et les barres obliques inverses en mode windowsPathsNoEscape
) ne peuvent pas être échappées ou non.
Faites correspondre la liste des fichiers, dans le style fnmatch ou glob. Si rien ne correspond et que options.nonull est défini, renvoyez une liste contenant le modèle lui-même.
var javascripts = minimatch.match(fileList, '*.js', { matchBase : true })
Créez un objet d'expression régulière à partir du modèle.
Toutes les options sont false
par défaut.
Jetez une tonne de trucs sur stderr.
Ne développez pas les ensembles d'accolades {a,b}
et {1..3}
.
Désactivez **
la correspondance avec plusieurs noms de dossiers.
Autorisez les modèles à correspondre aux noms de fichiers commençant par un point, même si le modèle ne comporte pas explicitement de point à cet endroit.
Notez que par défaut, a/**/b
ne correspondra pas a/.d/b
, sauf si dot
est défini.
Désactivez les modèles de style "extglob" comme +(a|b)
.
Effectuez une correspondance insensible à la casse.
Lorsqu'il est utilisé avec {nocase: true}
, créez des expressions régulières qui ne sont pas sensibles à la casse, mais laissez les parties de correspondance de chaîne intactes. N'a aucun effet lorsqu'il est utilisé sans {nocase: true}
Utile lorsqu'une autre forme de correspondance insensible à la casse est utilisée, ou si la représentation sous forme de chaîne d'origine est utile d'une autre manière.
Lorsqu'une correspondance n'est pas trouvée par minimatch.match
, renvoie une liste contenant le modèle lui-même si cette option est définie. Lorsqu'elle n'est pas définie, une liste vide est renvoyée s'il n'y a aucune correspondance.
Cela affecte uniquement les résultats de la méthode Minimatch.hasMagic
.
Si le modèle contient des extensions d'accolades, telles que a{b,c}d
, mais aucun autre caractère magique, alors la méthode Minimatch.hasMagic()
retournera false
par défaut. Lorsque cette option est définie, elle renvoie true
pour l'expansion des accolades ainsi que pour d'autres caractères magiques glob.
S'il est défini, les modèles sans barres obliques seront comparés au nom de base du chemin s'il contient des barres obliques. Par exemple, a?b
correspondrait au chemin /xyz/123/acb
, mais pas /xyz/acb/123
.
Supprime le comportement consistant à traiter #
au début d'un modèle comme un commentaire.
Supprimez le comportement consistant à traiter un leader !
caractère comme négation.
Renvoie les expressions négatives de la même manière que si elles n'étaient pas annulées. (C'est-à-dire vrai en cas de succès, faux en cas d'échec.)
Comparez un chemin partiel à un modèle. Tant que les parties du chemin présentes ne sont pas contredites par le motif, celui-ci sera traité comme une correspondance. Ceci est utile dans les applications dans lesquelles vous parcourez une structure de dossiers et ne disposez pas encore du chemin complet, mais souhaitez vous assurer que vous ne parcourez pas des chemins qui ne pourront jamais correspondre.
Par exemple,
minimatch('/a/b', '/a/*/c/d', { partial: true }) // vrai, pourrait être /a/b/c/dminimatch('/a/b', '/ **/d', { partial: true }) // vrai, pourrait être /a/b/.../dminimatch('/x/y/z', '/a/**/z', { partial : vrai }) // faux, car x !== un
Utilisez comme séparateur de chemin uniquement et jamais comme caractère d'échappement. S'il est défini, tous les caractères
sont remplacés par
/
dans le modèle. Notez que cela rend impossible la comparaison avec des chemins contenant des caractères de modèle global littéraux, mais permet la correspondance avec des modèles construits à l'aide de path.join()
et path.resolve()
sur les plates-formes Windows, imitant le comportement (bogué !) des versions antérieures sous Windows. . Veuillez utiliser avec prudence et tenez compte de la mise en garde concernant les chemins Windows.
Pour des raisons héritées, ceci est également défini si options.allowWindowsEscape
est défini sur la valeur exacte false
.
Lorsqu'un modèle commence par un chemin UNC ou une lettre de lecteur, et en mode nocase:true
, ne convertissez pas les parties racine du modèle en une expression régulière insensible à la casse, mais laissez-les plutôt sous forme de chaînes.
Il s'agit de la valeur par défaut lorsque la plate-forme est win32
et nocase:true
est défini.
Par défaut, plusieurs caractères /
(autres que le premier //
dans un chemin UNC, voir « Chemins UNC » ci-dessus) sont traités comme un seul /
.
Autrement dit, un modèle comme a///b
correspondra au chemin du fichier a/b
.
preserveMultipleSlashes: true
pour supprimer ce comportement.
Un nombre indiquant le niveau d'optimisation qui doit être apporté au modèle avant de l'analyser et de l'utiliser pour les correspondances.
Les parties Globstar **
sont toujours converties en *
lorsque noglobstar
est défini, et plusieurs **
parties adjacentes sont converties en une seule **
(c'est-à-dire que a/**/**/b
sera traité comme a/**/b
, car c'est équivalent dans tous les cas).
0
- N’apportez aucune autre modification. Dans ce mode, .
et ..
sont conservés dans le modèle, ce qui signifie qu'ils doivent également apparaître à la même position dans la chaîne du chemin de test. Par exemple, un modèle comme a/*/../c
correspondra à la chaîne a/b/../c
mais pas à la chaîne a/c
.
1
- (par défaut) Supprimez les cas où un double point ..
suit une partie de motif qui n'est pas **
, .
, ..
, ou vide ''
. Par exemple, le modèle ./a/b/../*
est converti en ./a/*
, et il correspondra donc à la chaîne de chemin ./a/c
, mais pas à la chaîne de chemin ./a/b/../c
. Les points et les portions de chemin vides dans le motif sont conservés.
2
(ou supérieur) - Optimisations beaucoup plus agressives, adaptées à une utilisation avec les cas de parcours de fichiers :
Bien que ces optimisations améliorent les performances des cas d'utilisation de parcours de fichiers tels que glob (c'est-à-dire la raison pour laquelle ce module existe), il existe des cas où il ne parviendra pas à correspondre à une chaîne littérale qui aurait été mise en correspondance au niveau d'optimisation 1 ou 0.
Plus précisément, bien que la méthode Minimatch.match()
optimise la chaîne du chemin du fichier de la même manière, entraînant les mêmes correspondances, elle échouera lorsqu'elle sera testée avec l'expression régulière fournie par Minimatch.makeRe()
, à moins que la chaîne du chemin ne soit la première. traité avec minimatch.levelTwoFileOptimize()
ou similaire.
Supprimez les cas où un double point ..
suit une partie de motif qui n'est pas **
, .
, ou vide ''
. Supprimez vide et .
parties du modèle, lorsque cela est sûr (c'est-à-dire n'importe où autre que la dernière position, la première position ou la deuxième position dans un modèle commençant par /
, car cela peut indiquer un chemin UNC sous Windows).
Convertir les modèles contenant <pre>/**/../<p>/<rest>
en équivalent <pre>/{..,**}/<p>/<rest>
, où <p>
est un modèle partie autre que .
, ..
, **
ou vide ''
.
Modèles de déduplication dans lesquels une partie **
est présente dans l'un et omise dans l'autre, et il ne s'agit pas de la partie du chemin final, et ils sont par ailleurs équivalents. Donc {a/**/b,a/b}
devient a/**/b
, car **
correspond à une partie de chemin vide.
Modèles de déduplication dans lesquels une partie *
est présente dans un modèle et un modèle sans points autre que **
, .
, ..
ou ''
est dans la même position dans l'autre. Donc a/{*,x}/b
devient a/*/b
, car *
peut correspondre à x
.
Lorsqu'il est défini sur win32
, cela déclenchera tous les comportements spécifiques à Windows (gestion spéciale des chemins UNC et traitement comme séparateurs dans les chemins de fichiers à des fins de comparaison.)
La valeur par défaut est la valeur de process.platform
.
Bien que le strict respect des normes existantes soit un objectif louable, certaines divergences existent entre minimatch et d'autres implémentations. Certains sont intentionnels, d’autres sont inévitables.
Si le motif commence par un !
caractère, alors il est nié. Définissez l'indicateur nonegate
pour supprimer ce comportement et traitez le début !
caractères normalement. Ceci est peut-être pertinent si vous souhaitez démarrer le modèle avec un modèle extglob négatif comme !(a|B)
. Multiples !
les caractères au début d'un motif annuleront le motif plusieurs fois.
Si un modèle commence par #
, alors il est traité comme un commentaire et ne correspondra à rien. Utilisez #
pour faire correspondre un #
littéral au début d'une ligne, ou définissez l'indicateur nocomment
pour supprimer ce comportement.
Le caractère double étoile **
est pris en charge par défaut, sauf si l'indicateur noglobstar
est défini. Ceci est pris en charge à la manière de bsdglob et bash 4.1, où **
n'a une signification particulière que s'il s'agit de la seule chose dans une partie de chemin. Autrement dit, a/**/b
correspondra a/x/y/b
, mais a/**b
ne le fera pas.
Si un modèle échappé n'a aucune correspondance et que l'indicateur nonull
est défini, alors minimatch.match renvoie le modèle tel qu'il est fourni, plutôt que d'interpréter les caractères d'échappement. Par exemple, minimatch.match([], "*a?")
renverra "*a?"
plutôt que "*a?"
. Cela revient à définir l'option nullglob
dans bash, sauf qu'elle ne résout pas les caractères de modèle échappés.
Si l’expansion des accolades n’est pas désactivée, elle est alors effectuée avant toute autre interprétation du modèle global. Ainsi, un modèle comme +(a|{b),c)}
, qui ne serait pas valide dans bash ou zsh, est d'abord développé dans l'ensemble de +(a|b)
et +(a|c)
, et ceux-ci la validité des modèles est vérifiée. Puisque ces deux éléments sont valides, la correspondance se produit.
Les modèles extglob négatifs sont traités aussi étroitement que possible à la sémantique Bash, mais il existe certains cas avec des extglobs négatifs qui sont extrêmement difficiles à exprimer dans une expression régulière JavaScript. En particulier, le modèle nié <start>!(<pattern>*|)*
correspondra en bash à tout ce qui ne commence pas par <start><pattern>
. Cependant, <start>!(<pattern>*)*
correspondra aux chemins commençant par <start><pattern>
, car la chaîne vide peut correspondre à la partie niée. Dans cette bibliothèque, <start>!(<pattern>*|)*
ne correspondra à aucun modèle commençant par <start>
, en raison d'une différence précise entre les modèles considérés comme "gourmands" dans l'expansion des expressions régulières et du chemin bash. Ce problème peut être résolu, mais non sans engendrer une certaine complexité et des coûts de performance, et le compromis ne semble pas valoir la peine d'être poursuivi.
Notez que fnmatch(3)
dans la libc est un comparateur de comparaison de chaînes extrêmement naïf, qui ne fait rien de spécial pour les barres obliques. Cette bibliothèque est conçue pour être utilisée dans la recherche globale et les parcours de fichiers, et elle fait donc des choses spéciales avec /
. Ainsi, foo*
ne correspondra pas à foo/bar
dans cette bibliothèque, même si ce serait le cas dans fnmatch(3)
.