我正在寻找一个可以匹配包含对核心模块的单个引用的任何代码行的正则表达式。
这样的事情:
const coreModuleMatches = /'^[var|const]{0,1}[a-z\$\_]{1,}=require([\'|"][assert|fs|path][\'|"])[;|,]{0,1}$/;
这应匹配所有这些行
var pth = require("path");
const asrt = require('assert'),
fs = require('fs'),
cp = require('child_process');
问题是我不能让简单的正则表达式工作,所以我更复杂的正则表达式目前没有希望。
在将代码与正则表达式匹配之前,我正在删除除换行符之外的所有空格,然后按换行拆分,以便我可以逐行遍历代码。欢迎任何想法。
答案 0 :(得分:1)
除了忘记逃避(
和)
之外,你的正则表达式中还有很少错误。
你的正则表达方式:
/'^[var|const]{0,1}[a-z\$\_]{1,}=require([\'|"][assert|fs|path][\'|"])[;|,]{0,1}$/
我的正则表达式:
/^(?:var|const)\s*([a-z$_]+\s*=\s*require\(('|")(?:assert|fs|path|child_process)\2\),?[\n\r\t\s]*)*;$/
<强>解释强>
(?:var|const)\s*([a-z$_]+\s*=\s*
这匹配从var
或const
到变量名称,后跟=
,包括所有空格。
require\(('|")(?:assert|fs|path|child_process)\2\),?
这匹配require()
以及其中的模块。当使用quote
捕获第一个('|")
时,\2
意味着它也是在关闭时重复的那个,因此引号的不匹配不会发生。
[\n\r\t\s]*)*;
这匹配第二个变量中的所有空格,包括换行符,制表符,空格,回车符。
的 Regex101 Demo 强>
答案 1 :(得分:1)
你不需要一个如此复杂的正则表达式,像/("|')(assert|fs|http)\1/
这样的东西应该足够了:
// don't list all modules by hand
var builtinModules = require('builtin-modules');
console.time('end');
var input =
`var pth = require("path");
var _ = require('lodash');
const asrt = require('assert'),
fs = require('fs'),
cp = require('child_process');`.split('\n');
// \1 is a reference to the matched beginning (double)quote
// to prevent something like "path'/'fs" to match
var rgxStr = `("|')(${ builtinModules.join('|') })\\1`;
var rgx = new RegExp(rgxStr);
// console.log(rgxStr); // uncomment to see how the Regex looks like
var output = input.filter((line) => line.match(rgx));
console.timeEnd('end');
console.log('input');
console.log(input);
console.log('--------------------------------------');
console.log('output');
console.log(output);
输出:
end: 0.428ms
input
[ 'var pth = require("path");',
'var _ = require(\'lodash\');',
'const asrt = require(\'assert\'),',
'fs = require(\'fs\'),',
'cp = require(\'child_process\');' ]
--------------------------------------
output
[ 'var pth = require("path");',
'const asrt = require(\'assert\'),',
'fs = require(\'fs\'),',
'cp = require(\'child_process\');' ]