Glob模式匹配

前言

在本文中我将以glob是什么,glob的语法,glob与正则表达式的差异等几个方面对glob模式匹配进行一个梳理,希望也能对读者起到一定的帮助。

glob 是什么

glob是用于文件名的一种模式匹配,全程global,起源于贝尔实验室的 Unix 最早期的版本。后来,这项功能以库函数glob()的形式提供,被用于shell等程序。在日常使用bash命令时,经常用到的如ls *.txt的命令就使用到了glob模式。

语法

分隔符和片段

概念:分隔符即为文件路径中的/,而路径通过split('/')得到数组的每一项即为片段。

示例

  • app/src/**有3个片段,分别为:app,src,**

基础语法

Glob 不匹配任何隐藏文件或文件夹。

通配符 描述 示例 匹配结果(部分) 不匹配(部分)
* 匹配单个片段中零或多个字符 src/*.ts src/a.ts , src/ant.ts src/a/a.ts
? 匹配单个片段中的任意单个字符 ?at cat, Bat at, tcat
[abc] 匹配单个片段的单个字符, 但字符需属于括号内的字符集合 [AB]ct Act, Bct cct
[a-z] 匹配单个片段的单个字符,但字符需在括号内字符范围 example[0-9] example0, example1 example10, examples
[!abc][^abc] 匹配单个片段的单个字符,但字符需不属于括号内的字符集合 [!ab].js / [^ab].js c.js ab.js, a.js
[!a-z]或者[^a-z] 匹配单个片段的单个字符,但字符需属于括号内字符范围 example[!3-7] / example[^3-7] example2, example1 example3, example5

扩展语法

通配符 描述 示例 匹配结果(部分) 不匹配(部分)
** 匹配一个或多个片段(跨片段)中的零或多个字符 app/src/** app/src/a,js, app/src/ab/c.js app/components/a.js
{x,y, ...} 匹配大括号内的所有模式,模式之间用逗号分隔,支持大括号嵌套,支持..匹配连续字符 {{a..b},c}.js a,js, b.js, c.js d.js, ab.js
`?(pattern pattern pattern)` 匹配0次或1次给定的模式 `a.?(txt
`*(pattern pattern pattern)` 匹配0次或多次给定的模式 `a.*(txt
`+(pattern pattern pattern)` 匹配1次或多次给定的模式 `a.+(txt
`@(pattern pattern pattern)` 严格匹配给定的模式 `a.@(txt
`!(pattern pattern pattern)` 匹配非给定的模式 `a.!(txt

与 regexp 的差异

glob模式主要用于匹配文件路径,也可匹配字符串,不过能力比regexp弱。需要注意的是,glob模式的许多元字符和regexp相同,但含义却是不同的。

glob regexp 精确的 regexp
* .* ^(?!\.)[^\/]*?$
? . ^(?!\.)[^\/]$
[a-z] [a-z] ^[a-z]$

glob 匹配的是整个字符串,而 regexp 默认匹配的是子串,regexp 如果要匹配整个字符串需显式指定^和$。

应用场景

glob最常见的应用场景就是匹配文件路径,在代码覆盖率istanbul中就使用了glob模式(test-exclude)用于筛选需要进行插桩的文件。

参考

posted @ 2022-11-24 20:28  川南烟雨  阅读(998)  评论(0编辑  收藏  举报