Node-Minimatch / Regex:匹配指定子目录

时间:2015-07-05 19:14:44

标签: javascript regex node.js regex-negation minimatch

我想匹配给定子文件夹中的所有子文件夹。

假设我有以下目录:

test/rock/martin
test/rock/steven
test/rock/steven/coolmusik
test/rock/steven/coolmusik/newmusic

test/pop/martin
test/pop/steven
test/pop/steven/mysubdir
test/pop/steven/anothersubdir

现在我想要匹配'rock'和'pop'中的所有内容,并限制给定名称。在这种情况下,它是'史蒂文'。

以下minimatch glob-rule到目前为止工作正常:

minimatch('./test', ['!*(rock|pop|steven)'], {matchBase: true}))

上述规则的翻译:

  

隐藏所有不在摇滚,流行和史蒂文中的东西。

但这是问题所在: 可以想象,minimatch在这种特殊情况下不包括子目录。

我希望它像......

minimatch('./test', ['!*(rock|pop|steven|PLUS_SUBDIRS_OF_STEVEN)'], {matchBase: true}))

......但遗憾的是,它不符合我的规则:

minimatch('./test', ['!*(rock|pop|steven/**)'], {matchBase: true}))

我的问题是: 除了rock + pop + steven + steven的子目录外,我怎么能隐藏所有东西?

目录结构的更好概述:

test
|-rock
|--martin
|--steven
|---coolmusik
|----newmusic
|-pop
|--martin
|--steven
|---mysubdir
|---anothersubdir

另外:如果minimatch无法处理这个问题,那么上面规则的常规Regex会是什么样子?

1 个答案:

答案 0 :(得分:0)

  

通过制作每个文件的列表然后对每个文件进行全局匹配,您无法获得.gitignore样式的行为。对于初学者来说,这是非常昂贵的(你可能有一个.gitignore文件夹,里面有100000个文件),而且,你必须跟踪父母是否被忽略。但是,它变得更加复杂,因为规则可能会导致您必须查找特定项目,如果它们被否定规则未被忽略。

来源: https://github.com/isaacs/minimatch/issues/8#issuecomment-5516685

'minimatch'的所有者写了一个名为 fstream-ignore 的模块来解决这个问题。 然而。这肯定超出了范围,与我的问题无关。我最终得到了一个普通的Javascript正则表达式,如原帖中所述。

<强>正则表达式:

new RegExp(^test\/(rock|pop)(?:\/|$)(?:steven|$)(?:\/.*|$)$);

示例:

var re = /^test\/(rock|pop)(?:\/|$)(?:steven|$)(?:\/.*|$)/mg;
var paths = 'test/rock/martin\ntest/rock/steven\ntest/rock/steven/coolmusik\ntest/rock/steven/coolmusik/newmusic\ntest/pop/martin\ntest/pop/steven\ntest/pop/steven/mysubdir\ntest/pop/steven/anothersubdir';

var match;

while ((match = re.exec(paths)) !== null) {
  if (match.index === re.lastIndex) {
    re.lastIndex++;
  }
  var old_content = document.getElementById('results').innerHTML;
  document.getElementById('results').innerHTML = old_content + '<br>' + match[0];
}
<b>Verify against:</b>
<pre>
test/rock/martin
test/rock/steven
test/rock/steven/coolmusik
test/rock/steven/coolmusik/newmusic

test/pop/martin
test/pop/steven
test/pop/steven/mysubdir
test/pop/steven/anothersubdir
</pre>

<br><hr><br>

<b>Get <u>steven</u>'s results</b>:
<div id="results"></div>