查找上一个导入语句的索引

时间:2016-07-15 16:42:06

标签: javascript regex node.js

我正在使用节点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语句的分号索引:import HomePage from '../../ui/pages/HomePage';因为它是最后一个。

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

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

如何匹配并获取最后一次导入的索引?

1 个答案:

答案 0 :(得分:1)

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

Splice&amp; 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) - 匹配换行符。您可以在此之后添加?以确保我们匹配字符串中的最后一行。

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