RegExp与Node.js中的预期模式不匹配

时间:2019-07-05 02:40:52

标签: javascript node.js regex

我正在编写一个脚本,它将使用我的所有Lambda函数并创建用于本地测试的Node服务器。我正在尝试从每个文件中删除所有dbconfig对象。我使用https://regexr.com/测试了我的模式,并且做了很多变体,所有变体都可以在其中工作,但是它们在我的脚本中不起作用。我不知道为什么。所有对象看起来像这样:

const dbconfig = {
  server: process.env.SERVER,
  userName: process.env.USER_NAME,
  password: process.env.PASSWORD,
  options: {
    database: process.env.DATABASE,
    table: process.env.TABLE,
    encrypt: true,
    requestTimeout: 300000,
    rowCollectionOnRequestCompletion: true,
  }
}

我已经尝试过(其中包括):

  • /(。+ [\ n \ r])。+ process.env(。+ [\ n \ r])+ / g
  • / const dbconfig(。+ [\ s \ n \ r])+ / g
  • /(。+ \ s)。+ process.env(。+ \ s)+ / g

其中的每一个都符合预期的匹配整个对象的声明,但是在Node中它将替换:

  • 什么都没做,
  • 第一行(const dbconfig = {
  • 包含process.env的所有行,其余部分保留

我不知道为什么我会得到不同的结果,为什么会失败。欢迎任何建议!

编辑: 抱歉,没有足够的细节。替换是指我正在替换空字符串''。 我正在将文件读入目录名称循环中的数组中,如下所示:

files.push(fs.readFileSync(`../lambda/${folder}/index.js`, {encoding: 'utf8'}));

我从每个这样的库中提取所需的库:

let imports = new Set();
let arr;
files.forEach((file, idx) => {
  while ((arr = replaceOptions.from[0].exec(file)) !== null) {
    imports.add(arr[0]);
  }
});

然后我将文件加入一个主文件中,去掉需求并尝试进行这些配置,然后在顶部附加一个副本:

fs.writeFileSync('joined.js', files.join('\n'));

try {
  const results = replace.sync(replaceOptions);
  console.log('Replacement results:', results);
}
catch (error) {
  console.error('Error occurred:', error);
}

fs.writeFileSync('server.js', Array.from(imports.values()).join('\n'));
fs.appendFileSync('server.js', fs.readFileSync('joined.js'));

我以前是自己进行字符串替换的,但是为了方便起见,最终还是使用了npm包replace-in-file jsut,以防万一我在那儿塞了东西。 是的,我确实意识到该代码目前有点混乱且效率低下,它只是试图获得所需结果的基本成果的反复尝试。

1 个答案:

答案 0 :(得分:0)

我仍然不知道为什么我会得到在线正则表达式生成器/测试器和Node之间的区别,但是您就可以了。我现在有一个可行的实现:

/(.*\s*).+process\.env(.*\s*)*?\}\s*\}/gm