javascript - globbing - 匹配某些文件扩展名但不匹配其他文件扩展名的正确方法

标签 javascript node.js gruntjs glob node-glob

我将下面的代码片段作为 grunt-aws-s3 任务的一部分编写。

var weekCache = 'css|js';
var yearCache = 'jpg|jpeg|png|gif|ico|eot|otf|ttf|woff|woff2';
var prodFiles = [
    {expand: true, cwd: 'public', src: ['**/*.!('+weekCache+'|'+yearCache+')'], dest: '/'},
    {expand: true, cwd: 'public', src: ['**/*.@('+weekCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=604800, public'}}, // enable stream to allow large files
    {expand: true, cwd: 'public', src: ['**/*.@('+yearCache+')'], dest: '/', stream: true, params: {CacheControl: 'max-age=31536000, public'}},
];

这个想法是在 prodFiles 变量中包含三个不同的匹配项:

  1. 匹配除 yearCacheweekCache 匹配的文件之外的所有文件
  2. 匹配weekCache中携带的所有扩展名的文件
  3. 匹配yearCache中携带的所有扩展名的文件

它或多或少有效,我在 public 目录及其子目录中有 63 个文件。然而这些规则匹配了 72 个文件,很明显有些文件至少匹配了两次。

我的通配符有什么问题吗?

编辑:

使用 node-glob-all 进行测试表明错误出现在第一个模式中:

$ glob-all '**/*.!(css|js)'
assets/css/style-nuvue6sithwirecbhvw3dkaobiojqvtadsnhguwi7k04xklybw5djl1smadp.min.css
assets/images/favicon.ico
assets/js/jquery.fancybox.js
assets/js/jquery.fancybox-thumbs.js

我期望此模式返回除 *.js*.css 之外的所有内容。针对其他两个规则的测试返回了正确的文件。

$ glob-all '**/*.@(css|js)'
assets/css/style-nuvue6sithwirecbhvw3dkaobiojqvtadsnhguwi7k04xklybw5djl1smadp.min.css
assets/js/jquery.fancybox.js
assets/js/jquery.fancybox-thumbs.js

所以,问题是如何正确否定模式'**/*.!(css|js)'

最佳答案

我相信您的问题是您的文件名包含多个点 (.)。

您的模式指定查找所有包含一定数量的非点字符、后跟点字符、后跟“css”或“js”以外的任何字符的文件名。

我们以文件名“jquery.fancybox.js”为例。通过这个文件名,我们发现有一些非点字符“jquery”,后面跟着一个点“.”,后面跟着不是“css”的字符,不是“js”,“fancybox.js”。该文件名与模式匹配,因此被返回。

如果上面的文件名是“fancybox.js”,它将匹配一些非点字符“fancybox”,后跟一个点“.”,但后跟不是“css”和“js”的字符。因此该文件名将无法匹配模式并且不会被返回。

我们想要做的是在否定模式中指定“.css”或“.js”扩展名之前可能有更多非点字符。我们可以通过以下模式来做到这一点:

'**/*.!(*(*.)js|*(*.)css)'

关于javascript - globbing - 匹配某些文件扩展名但不匹配其他文件扩展名的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38647452/

相关文章:

javascript - Lightning 输入字段的值未定义,即使它有值

javascript - 如何在一行中匹配 javascript 中的正则表达式

javascript - 在 API 中使用不同的计算规则

javascript - Cherrypy和JS,找不到图像

python - 理解 Python 的 Base64 解码字节表示

git - 如何为同步源代码构建 docker 容器?

node.js - 启动剑圣时出错

javascript:在所有选项卡中运行一次代码

angularjs - 配置 Yeoman 以构建非根项目

javascript - grunt-contrib-jasmine ReferenceError : Can't find variable: jQuery