在JavaScript中使用替换用正则表达式添加“ .js”扩展名

时间:2018-08-15 00:39:12

标签: javascript regex string replace

假设我必须导入语句

// other code...
import * as Foo from "../some/bar";
import { baz } from './dir/qux';
// other code...

我想在上述每个文件的末尾添加一个.js扩展名,像这样

import * as Foo from "../some/bar.js";
import { baz } from './dir/qux.js';

在整个代码字符串中。

在JavaScript中用正则表达式替换的正确方法是什么?

globalcase中匹配

str.replace(regexp, newSubstr|function)

String.replace docs

谢谢。

3 个答案:

答案 0 :(得分:2)

查找以import开头并包含斜杠,后跟非斜杠,非句点字符的行,并提前查找['"];?以标识字符串和行的结尾:

const codeStr = `
// other code...
import * as Foo from "../some/bar";
import { baz } from './dir/qux';
import { bar } from './dir/bar.js';
// other code...
`;
console.log(
  codeStr.replace(/import .+\/[^\/\.]+(?=['"];?$)/gm, '$&.js')
);

答案 1 :(得分:1)

这似乎可行

查找:
/^(import[^\S\r\n].+?[^\S\r\n]from[^\S\r\n]*(["']))((?:(?!(?:\.js)?\2)[\S\s])+)(\2\s*;)/mg

替换:
$1$3.js$4

https://regex101.com/r/Obcf0S/1

可读正则表达式

 ^                             # BOL
 (                             # (1 start), Preamble
      import [^\S\r\n] .+? 
      [^\S\r\n] 
      from [^\S\r\n]* 
      ( ["'] )                      # (2), Delimiter
 )                             # (1 end)
 (                             # (3 start), Body
      (?:
           (?!
                (?: \.js )?
                \2 
           )
           [\S\s] 
      )+
 )                             # (3 end)
 ( \2 \s* ; )                  # (4), Postfix

答案 2 :(得分:0)

尝试一下:

let match = /(import.*)("|');/g.exec(`import { baz } from './dir/qux';`)

然后您将获得以下列表:

(3) ["import { baz } from './dir/qux';", "import { baz } from './dir/qux", "'", index: 0, input: "import { baz } from './dir/qux';", groups: undefined]

您只需要在元素1和2之间添加.js。

match[1]+".js"+match[2]