2016-07-15 7 views
1

私はノードのfs.readFileSync(file)を使ってファイルを読んでいます。私は、インポートステートメントの最後のオカレンスのインデックスを見つける必要があります。最後のインポートステートメントのインデックスを見つける

私が読んでいるのjsファイルのようなものになります。したがって、この特定のケースでは、私はこのimport文のためのセミコロンのインデックスを見つける必要があるでしょう

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という文字列が使用されています。この場合、正規表現を渡す必要があります。

逆にルックアップする正規表現が必要なようです。

最後にインポートされたインデックスを照合して取得するにはどうすればよいですか?

+0

'input.match(/^import。*/gm).pop()' - https://jsfiddle.net/f6szkm3m/ –

+0

私は注意を払わなかった:あなた最後の 'import'のインデックスが必要です - https://jsfiddle.net/f6szkm3m/1/はどうですか?または 'var m = input。マッチ(/ ^([\ s \ S] * \ n)?import。* /); if(m){ document.body.innerHTML = m.index +(m [1]?m [1] .length:0); } ' –

+0

(フィドル#2 - https://jsfiddle.net/f6szkm3m/2/) –

答えて

1

あなたが探したいのは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+いずれかのオプションのシーケンスchできるだけ多くのaracters、最後
  • importになって - 宇宙
  • .*と文字列リテラルimportは -
  • (?:\r?\n|\r)(行の残りの部分と一致するように)改行以外の任意の0+文字に続きます - 改行に一致します。この後に?を追加して、文字列の最後の行と一致することを確認してください。

私は$&を使用しています。これは一致全体を逆参照して(結果の文字列に完全一致を挿入します)。

+0

説明が追加されました。 –

関連する問題