Open whinc opened 4 years ago
thx,这三个表做的太帅了,一眼查。
cool!!!
Beautiful!
勘误:
[^abc]或[!abc] [^a-z]或[!a-z]
的描述、示例搞错了,和上面的重复了(可能是复制文章时的问题)
我看你发在掘金的文章里是正确的:https://juejin.cn/post/6844904077801816077
勘误:
[^abc]或[!abc] [^a-z]或[!a-z]
的描述、示例搞错了,和上面的重复了(可能是复制文章时的问题)
我看你发在掘金的文章里是正确的:https://juejin.cn/post/6844904077801816077
谢谢指出,已更正
内容目录:
介绍
根据维基百科的介绍,在计算机编程中 glob 模式表示带有通配符的路径名,例如在 bash 中查看文件列表:
它最初是贝尔实验室 Unix 系统上的一个名叫 glob 的命令(glob 是 global 的缩写),用于展开命令行中的通配符。后来系统提供了该功能的 C 语言库函数
glob()
,知名的 shell 解释器就使用了该接口,shell 脚本和命令行中使用的 glob 模式匹配功能便源自于此。基础语法
相比正则表达式大量的元字符,glob 模式中元字符极少,所以掌握起来也很快。glob 默认不匹配隐藏文件(以点
.
开头的文件或目录),下面是 glob 的语法:*
Law*
Law
,Laws
和Lawer
La
,aw
?
?at
cat
,bat
at
[abc]
[cb]at
cat
,bat
at
,bcat
[a-z]
[a-z]at
aat
,bat
,zat
at
,bcat
,Bat
[^abc]
或[!abc]
[!CB]at
cat
,bat
Cat
,Bat
[^a-z]
或[!a-z]
[!A-Z]at
aat
,bat
,zat
Aat
,Bat
,Zat
扩展语法
除了基础语法外,bash 还支持 glob 的一些扩展语法,主要包含三种:
三种扩展语法的定义和描述如下:
{x, y, ...}
a.{png,jp{,e}g}
a.png
,a.jpg
,a.jpeg
**
**
后面紧接着/
则只匹配目录,不含隐藏目录src/**
src/a.js
,src/b/a.js
,src/b/
src/.hide/a.js
?(pattern-list)
a.?(txt\|bin)
a.
,a.txt
,a.bin
a
*(pattern-list)
a.*(txt\|bin)
a.
,a.txt
,a.bin
,a.txtbin
a
+(pattern-list)
a.+(txt\|bin)
a.txt
,a.bin
,a.txtbin
a.
,a
@(pattern-list)
a.@(txt\|bin)
a.txt
,a.bin
a.
,a.txtbin
!(pattern-list)
a.!(txt\|bin)
a.
,a.txtbin
a.txt
,a.bin
与 regexp 的差异
glob 模式主要用于匹配文件路径,当然也可以用于匹配字符串,不过在匹配字符串的能力上比 regexp 要弱很多。由于 glob 模式和 regexp 存在相同的元字符,但是含义却不同,容易导致混淆,为了避免混淆,下面将 glob 模式转换成对应的 regexp 表示,以便区分他们的异同点。
*
.*
^(?!\.)[^\/]*?$
?
.
^(?!\.)[^\/]$
[a-z]
[a-z]
^[a-z]$
JavaScript API
通过上面的介绍,已经了解到 glob 模式可以用于匹配文件路径,甚至字符串,如何使用呢?在 JavaScript 中,正则表达式是以标准 API 形式提供的,开箱即用。但是 glob 模式匹配并非 JavaScript 中的标准 API,需要自行解析和匹配,这里介绍一个用 JavaScript 编写的 glob 的匹配库 minimatch,它支持 glob 基础语法和扩展语法,可以实现 glob 的测试、匹配以及转换成正则表达式。下面是使用示例:
应用例子
glob 最常见的应用场景是匹配文件路径,使用 glob 匹配文件路径比正则表达式更简洁。下面例子实现利用 glob 模式过滤文件路径:
如果要通过 glob 模式遍历文件系统,可使用 node-glob ,它基于 minimatch 和 node 实现 glob 模式遍历文件的 API。
参考