Regex для равномерного форматирования имен файлов и путей - PullRequest
0 голосов
/ 26 января 2019

Я должен извлечь несколько имен файлов из строки, включая возможный путь.Проблема (для меня) в том, что строка может иметь много вариаций, и, если не присутствует, символ должен быть вставлен перед именем файла.Я думаю, что приведенный ниже пример должен облегчить понимание.

Я пробовал следующий код Spahetti, потому что я не regex profi и не знаю, как выполнять несколько манипуляций.Также в этом фрагменте скрипта вставка символа перед отсутствующим именем файла.Обратите внимание, что я нажимаю каждое отдельное имя файла в массиве filenames

const regex = /@import(.*);/gm; const str = content; let m;
while ((m = regex.exec(str)) !== null) {
  if (m.index === regex.lastIndex) regex.lastIndex++; // stop infinity loop
  // Init variable
  var filename = m[1];
  // Remove spaces
  filename = filename.trim();
  // Remove ', ", ` from first and last character
  if (filename.charAt(0) === "'" || filename.charAt(0) === '"' || filename.charAt(0) === "`") filename = filename.substr(1);
  if (filename.charAt(filename.length - 1) === "'" || filename.charAt(filename.length - 1) === '"' || filename.charAt(filename.length - 1) === "`") filename = filename.substring(0, filename.length - 1);;
  // Remove / from first character
  if (filename.charAt(0) === "/") filename = filename.substr(1);
  // Remove _ from first character
  if (filename.substr(filename.length - 3) !== ".js") filename = filename+".js";
  // Push
  filenames.push(filename);
}

Вот теперь начальная строка:

// i am a 'comment'
@import 'jquery-3.3.1';
@import   "_slick.js";
@import            `subfolder/_analytics`;
@import            `/subfolder/bootstrap`;



@import     `subfolder/javascript/marvin.js`;

Это должно быть включено в filenames массив после манипуляции со строкой:

[ '_jquery-3.3.1.js', '_slick.js', 'subfolder/_analytics.js', 'subfolder/_bootstrap.js', 'subfolder/javascript/_marvin.js' ]

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Вы можете использовать группу захвата, чтобы захватить одну из кавычек, а затем использовать обратную ссылку на первую группу захвата, чтобы убедиться, что начальный символ совпадает с последним символом.

Тогда вы можете разделить косую черту и соответственно изменить последний элемент.Чтобы получить свои значения, вы можете использовать вторую группу захвата.

@import.*?([`"'])(.*?)\1

Это будет соответствовать:

  • @import Соответствовать буквально
  • .*? Соответствовать любомусимвол без жадности
  • ([`"']) Совпадение символов, перечисленных в классе персонажей
  • (.*?) Захват в группе 2 любой символ без жадности
  • \1 Ссылка начто записано в группе 1

Regex demo

const regex = /@import.*?([`"'])(.*?)\1/g;
const str = `// i am a 'comment'
@import 'jquery-3.3.1';
@import   "_slick.js";
@import            \`subfolder/_analytics\`;
@import            \`/subfolder/bootstrap\`;



@import     \`subfolder/javascript/marvin.js\`;`;
let m;
let res = [];
let checkUnderscore = x => !x.startsWith("_") ? "_" + x : x;
let checkExtension = x => !x.endsWith(".js") ? x + ".js" : x;
while ((m = regex.exec(str)) !== null) {
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  let parts = m[2].replace(/^\/+/, '').split("/");
  let length = parts.length;
  res.push(
    parts.map((part, i) => i === length - 1 ? checkExtension(checkUnderscore(part)) : part).join('/')
  );
}
console.log(res);
0 голосов
/ 26 января 2019

Вы можете использовать регулярное выражение, как это

@import[^"'`]*["'`]\/*([^;]+)["'`][^;]*; 

Этот извлекает путь без кавычек или ведущих /

Вот пример:

const str = `
// i am a 'comment'
@import 'jquery-3.3.1';
@import   "_slick.js";
@import            \`subfolder/_analytics\`;
@import            \`/subfolder/bootstrap\`;



@import     \`subfolder/javascript/marvin.js\`;`

const regex = /@import[^"'`]*["'`]\/*([^;]+)["'`][^;]*;/gm
const paths = [];


while ((m = regex.exec(str)) !== null) {
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }

  let path = m[1]
  if (!path.endsWith(".js")) {
    path = `${path}.js`
  }

  path = path.replace(/(\/|^)([^_][^\/]*\.js)$/, "$1_$2")
  paths.push(path)
}

console.log(paths)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...