字符串是否匹配通配符模式

10

I have an array of paths, let's say:

/Users/alansouza/workspace/project/src/js/components/chart/Graph.js

另外,我在配置文件中的此路径上有一个附加属性的条目,使用通配符(glob)格式,例如:

{
  '**/*.js': {
    runBabel: true
  }
}

问题:有没有一种简单的方法来验证路径是否与通配符表达式匹配?

例如:

const matches = Glob.matches(
  '**/*.js',
  '/Users/alansouza/workspace/project/src/js/components/chart/Graph.js'
);

if (matches) {
  //do something
}

提醒:我正在使用https://github.com/isaacs/node-glob


嘿,我不熟悉在全局表达式中使用两个星号,你的示例中的 *** 有什么区别? - chiliNUT
我认为我理解了你的问题,只是不明白在 glob 表达式中连续出现两个星号的含义是什么。 - chiliNUT
1
你的编辑并没有针对@chiliNUT提出的(好)问题做出回应!所以,再次问一下:**是什么意思? - cFreed
2
再次抱歉。这意味着它将匹配路径中的任何子目录级别。我对通配符模式并不是很精通,所以请查看这个链接:https://dev59.com/AWoy5IYBdhLWcg3wdt4L - Alan Souza
1
很酷,我刚学到了新东西:)。所以,我的想法是将glob转换为正则表达式,然后javascript可以使用它来验证路径名。这里有一个可以做到这一点的npm包:https://www.npmjs.com/package/glob-to-regexp - chiliNUT
是的,我也得出了同样的结论。你介意把它发布为答案,这样我就可以接受它了吗?如果node-glob默认支持它会很好(我将在项目本身中处理此功能请求)。 - Alan Souza
2个回答

12

2
我自己正在使用node-glob。但它没有我需要的“匹配”支持。 - Alan Souza
从我的经验来看(没有测试),你似乎可以这样做:用([^./]*)替换单个星号,用([^/]+/*)+替换双星号,并将其称为正则表达式。 - chiliNUT
@AlanSouza 还发现了 minimatch,但它可能仍然具有与 node-glob 相同的限制,因为它是由同一人创建的。 - chiliNUT

7

正如 @chiliNUT 在评论中提出的那样,minimatch 有这种行为:

minimatch("file.js", "**/*.js") // true/false
minimatch.match(["file1.js", "file2.js"], "**/*.js") // array of matches

很好!这是对我不太完整答案的一个很好的解决方案。 - chiliNUT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接