📜  JS glob 到正则表达式 - Javascript (1)

📅  最后修改于: 2023-12-03 15:02:22.331000             🧑  作者: Mango

JS glob 到正则表达式 - Javascript

JavaScript中的glob是指用于匹配文件路径的模式字符串,常用于文件搜索、文件筛选等场景中。但有时候,我们需要将glob字符串转换为正则表达式以进行更精细的匹配操作。

glob语法

先来看一下glob字符串的语法:

  • * 匹配任意数量的任意字符(除了 /)。
  • ? 匹配单个任意字符(除了 /)。
  • [abc] 匹配括号中的任意一个字符。
  • !(pattern|pattern|pattern) 匹配括号中未列出的任意字符。
  • ?(pattern|pattern|pattern) 匹配括号中的任意一个字符,或者不匹配。
  • *(pattern|pattern|pattern) 匹配括号中的任意数量的字符,包括0个。
  • +(pattern|pattern|pattern) 匹配括号中的任意数量的字符,包括1个。
  • @(pattern|pattern|pattern) 匹配括号中的任意一个字符。
  • \ 转义下一个字符,使其变成字面量。

注意:在glob字符串中,.开头的文件名和目录名会被视为隐藏文件/目录。

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字符串,并将其转换为正则表达式。