Я пытаюсь написать приложение, которое просматривает каталог и помечает все файлы (будь то в каталоге или подкаталогах), которые имеют ключевое слово TODO (тот, который мигает/подсвечивается цветом всякий раз, когда мы кодируем в нашем редакторе кода [я используя код визуальной студии]
Я запустил большую часть кода, это только последний бит, который меня озадачивает: поскольку мой RegEx принимает «TODO» как блок слов, он подбирает даже файлы, которые имеют TODO в качестве имени переменной/содержимого строки, например.
var todo = 'TODO'
or
var TODO = 'abcdefg'
так что это портит мои тестовые примеры. Как нам написать надежное регулярное выражение/выражение TODO, которое может подобрать только ключевое слово TODO (например, //TODO
или // TODO
) и игнорировать другие варианты использования (в переменных/строках и т. д.) Я не хочу жестко кодировать // или что-либо в также регулярное выражение, так как я бы предпочел, чтобы оно было как можно более кросс-языковым (например, //
(однострочный) или /*
(многострочный) для javascript, #
для python и т. д.)
Вот мой код:
import * as fs from 'fs';
import * as path from 'path';
const args = process.argv.slice(2);
const directory = args[0];
// Using recursion, we find every file with the desired extention, even if its deeply nested in subfolders.
// Returns a list of file paths
const getFilesInDirectory = (dir, ext) => {
if (!fs.existsSync(dir)) {
console.log(`Specified directory: ${dir} does not exist`);
return;
}
let files = [];
fs.readdirSync(dir).forEach(file => {
const filePath = path.join(dir, file);
const stat = fs.lstatSync(filePath); // Getting details of a symbolic link of file
// If we hit a directory, recurse our fx to subdir. If we hit a file (basecase), add it to the array of files
if (stat.isDirectory()) {
const nestedFiles = getFilesInDirectory(filePath, ext);
files = files.concat(nestedFiles);
} else {
if (path.extname(file) === ext) {
files.push(filePath);
}
}
});
return files;
};
const checkFilesWithKeyword = (dir, keyword, ext) => {
if (!fs.existsSync(dir)) {
console.log(`Specified directory: ${dir} does not exist`);
return;
}
const allFiles = getFilesInDirectory(dir, ext);
const checkedFiles = [];
allFiles.forEach(file => {
const fileContent = fs.readFileSync(file);
// We want full words, so we use full word boundary in regex.
const regex = new RegExp('\\b' + keyword + '\\b');
if (regex.test(fileContent)) {
// console.log(`Your word was found in file: ${file}`);
checkedFiles.push(file);
}
});
console.log(checkedFiles);
return checkedFiles;
};
checkFilesWithKeyword(directory, 'TODO', '.js');
Помощь приветствуется!!