Node-Minimatch/Regex: сопоставлять подкаталоги в указанном подкаталоге
Я хотел бы сопоставить все подпапки в данной подпапке.
Допустим, у меня есть следующие каталоги:
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
Теперь я хотел бы сопоставить все в "рок" и "поп", с ограничением данного имени. В данном случае это "Стивен".
До сих пор работает следующее мини -правило:
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 справиться с этим, как будет выглядеть регулярное регулярное выражение для приведенных выше правил?
1 ответ
Вы не можете получить поведение в стиле.gitignore, составив список каждого файла, а затем сопоставив его каждому. Начнем с того, что это нелепо дорого (у вас может быть папка.gitignore'd с 100000 файлами в ней или что-то в этом роде), а также вы должны отслеживать, был ли родитель проигнорирован. Однако это усложняется, потому что правило может привести к тому, что вам придется искать конкретные элементы, если они не игнорируются правилом с отрицанием.
Источник: https://github.com/isaacs/minimatch/issues/8
Владелец minimatch написал модуль fstream-ignore, который решает эту проблему. Тем не мение. Это определенно выходит за рамки и не связано с моим вопросом. Я заканчиваю с регулярным регулярным выражением Javascript, как упомянуто в оригинальном посте.
Regex:
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>