正则表达式统一格式化文件名和路径

时间:2019-01-26 17:22:58

标签: javascript regex

我必须从包含可能路径的字符串中提取几个文件名。问题(对我而言)是字符串可以有多种变体,并且如果不存在,则必须在文件名之前插入一个字符。我认为下面的示例应该更易于理解。

我尝试了以下Spahetti代码,因为我不是正则表达式专业人士,并且不知道如何执行多种操作。同样在此脚本中,在缺少文件名之前插入字符。请注意,我推送了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 :(得分:1)

您可以使用这样的正则表达式

@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)

答案 1 :(得分:1)

您可以使用捕获组捕获两个引号之一,然后对第一个捕获组使用向后引用,以确保开头字符与结尾字符匹配。

然后,您可以分割一个正斜杠并相应地修改最后一个项目。要获取您的值,您可以使用另一个捕获组。

<?php echo $count = rand(1,999); ?>

这将匹配:

  • Warning: count(): Parameter must be an array or an object that implements Countable in <b>/homepages/36/d362586048/htdocs/genag/wp- content/themes/genag- theme/framework/admin/functions/functions.mediauploader.php on line 127 字面上匹配
  • if ( count( $_posts ) ) { $_id = $_posts->ID; } else { 匹配任何不适合char的字符
  • @import.*?([`"'])(.*?)\1 匹配字符类中列出的字符
  • @import在第2组中捕获任何不贪心的字符
  • .*?向后引用第1组中捕获的内容

Regex demo

([`"'])