我必须从包含可能路径的字符串中提取几个文件名。问题(对我而言)是字符串可以有多种变体,并且如果不存在,则必须在文件名之前插入一个字符。我认为下面的示例应该更易于理解。
我尝试了以下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' ]
答案 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组中捕获的内容
([`"'])