📅  最后修改于: 2023-12-03 15:02:22.331000             🧑  作者: Mango
JavaScript中的glob是指用于匹配文件路径的模式字符串,常用于文件搜索、文件筛选等场景中。但有时候,我们需要将glob字符串转换为正则表达式以进行更精细的匹配操作。
先来看一下glob字符串的语法:
*
匹配任意数量的任意字符(除了 /
)。?
匹配单个任意字符(除了 /
)。[abc]
匹配括号中的任意一个字符。!(pattern|pattern|pattern)
匹配括号中未列出的任意字符。?(pattern|pattern|pattern)
匹配括号中的任意一个字符,或者不匹配。*(pattern|pattern|pattern)
匹配括号中的任意数量的字符,包括0个。+(pattern|pattern|pattern)
匹配括号中的任意数量的字符,包括1个。@(pattern|pattern|pattern)
匹配括号中的任意一个字符。\
转义下一个字符,使其变成字面量。注意:在glob字符串中,.
开头的文件名和目录名会被视为隐藏文件/目录。
我们可以借助第三方库globrex来将glob字符串转换为正则表达式。globrex可以帮助我们把glob模式转换为对应的正则表达式,并提供了最小化(minimizing)这个正则表达式的选项。
const globrex = require('globrex');
const globPattern = '**/*.js';
const regexOptions = { globstar: true };
const { regex } = globrex(globPattern, regexOptions);
console.log(regex);
输出结果:
/^(?:(?:(?!\/\.)(?=.)[^/]*(?:\/|$))*?)?([^/]*?\.js)$/
可以看出,globrex将**/*.js
转换为了包含负向前瞻、零宽断言等高级语法的正则表达式。
我们可以使用转换后的正则表达式来进行文件筛选,比如:
const fs = require('fs');
const regex = /^(?:(?:(?!\/\.)(?=.)[^/]*(?:\/|$))*?)?([^/]*?\.js)$/;
fs.readdirSync('.')
.filter(file => regex.test(file))
.forEach(file => console.log(file));
这段代码列出了当前目录中所有后缀为.js
的文件。
另外,我们还可以在构建工具、babel等场景中使用glob字符串,并将其转换为正则表达式。