查找最后一个导入语句的索引

Finding the index of the last import statement

本文关键字:索引 语句 导入 最后一个 查找      更新时间:2023-09-26

我正在使用 Node 的fs.readFileSync(file)读取文件。我需要找到导入语句最后一次出现的索引。

我正在阅读的js文件将如下所示:

import React from 'react';
import { FlowRouter } from 'meteor/kadira:flow-router';
import { mount } from 'react-mounter';
import { AppLayout } from '../../ui/layouts/AppLayout';
import HomePage from '../../ui/pages/HomePage';
FlowRouter.route('/', {
  name: 'home',
  action() {
    mount(AppLayout, {
      content: (<HomePage />)
    });
  }
});

因此,在这种特殊情况下,我需要找到此导入语句的分号索引:import HomePage from '../../ui/pages/HomePage';因为它是最后一个。

我已经研究了str.lastIndexOf(searchValue[, fromIndex])但它需要一个字符串作为searchValue,在这种情况下,我需要传入正则表达式。

似乎我需要一个可以反向查找的正则表达式。

如何匹配并获取上次出现的导入的索引?

我认为您要找到的是最后一行,以import开头,并在它之后插入另一行。有几种方法。

拼接和indexOf

// splice code from http://stackoverflow.com/a/4314050/3832970
String.prototype.splice = function(idx, rem, str) {
    return this.slice(0, idx) + str + this.slice(idx + Math.abs(rem));
};
var input = "import React from 'react';'nimport { FlowRouter } from 'meteor/kadira:flow-router';'nimport { mount } from 'react-mounter';'nimport { AppLayout } from '../../ui/layouts/AppLayout';'nimport HomePage from '../../ui/pages/HomePage';'n'nFlowRouter.route('/', {'n  name: 'home','n  action() {'n    mount(AppLayout, {'n      content: (<HomePage />)'n    });'n  }'n});";
var strt = input.lastIndexOf("'nimport ");
strt = input.indexOf("'n", strt+1);
document.body.innerHTML = "<pre>" +  input.splice(strt+1, 0, "import Example from ''../../example'';'n") + "</pre>";

在这里,strt = input.lastIndexOf("'nimport ")找到换行符之后的最后一import,后面跟一个空格。然后,找到下一个换行符,位置用 strt = input.indexOf("'n", strt+1); 递增。然后我们只需插入带有 splice 的字符串。

正则表达式

var input = "import React from 'react';'nimport { FlowRouter } from 'meteor/kadira:flow-router';'nimport { mount } from 'react-mounter';'nimport { AppLayout } from '../../ui/layouts/AppLayout';'nimport HomePage from '../../ui/pages/HomePage';'n'nFlowRouter.route('/', {'n  name: 'home','n  action() {'n    mount(AppLayout, {'n      content: (<HomePage />)'n    });'n  }'n});";
document.body.innerHTML = "<pre>"
   + input.replace(/^(?:['s'S]*'n)?import .*(?:'r?'n|'r)/, 
     '$&import Example from ''../../example'';'n')
   + "</pre>";

在这里,正则表达式匹配:

  • ^ - 字符串的开头
  • (?:['s'S]*'n)? - 一个由 0+ 任何字符组成的可选序列,尽可能多地到达最后一个
  • import - 带空格的文本字符串import
  • .* - 后跟 0+ 除换行符以外的任何字符(以匹配行的其余部分)
  • (?:'r?'n|'r) - 匹配换行符。您可以在此之后添加?以确保我们匹配字符串中的最后一行。

在替换中,我使用了 $& ,对整个匹配项的反向引用(它将整个匹配项插入到结果字符串中)。