首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找上一条导入语句的索引

查找上一条导入语句的索引
EN

Stack Overflow用户
提问于 2016-07-15 16:42:06
回答 1查看 267关注 0票数 1

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

我正在读的js文件看起来类似于:

代码语言:javascript
复制
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,在本例中,我需要传递一个正则表达式。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-15 18:53:21

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

indexOf Splice &

代码语言:javascript
复制
// 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插入字符串。

Regex

代码语言:javascript
复制
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>";

在这里,regex匹配:

  • ^ -字符串的开始
  • (?:[\s\S]*\n)? -一个可选的0+序列--尽可能多的字符,直到最后一个字符
  • import -带有空格的文字字符串import
  • .* -在0+后面跟着除换行符以外的任何字符(以匹配行的其余部分)
  • (?:\r?\n|\r) -匹配一个行间隔。您可以在后面添加?,以确保与字符串中的最后一行匹配。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38401219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档