正则表达式查找并用相对路径替换ES6裸模块

时间:2018-06-27 18:21:52

标签: regex

我有很多使用裸模块说明符的npm / Yarn JS库,例如:

import { ComponentName } from '@org/component-name';

我正在尝试构建一个正则表达式,以用JS可以理解的相对路径替换这些正则表达式:

import { ComponentName } from '../@org/component-name/component-name.js';

我正在使用正则表达式执行此操作,当前看起来是like this

/(?<key>import|export)\s+(?:(?:\s*(?<alias>[\w\r\n\t,{}\s\* ]+)\s*)\s*from)?\s*(?:["']?(?<ref>[@\w\s\\\/\-\.]+)["']?)/gm

到目前为止:

  • 在语法的每个部分使用命名组
  • 找到importexport关键字。
  • 查找可选的多行别名
  • 查找参考

然后我可以找到所有匹配项,在磁盘上找到引用,找出相对路径,然后将其插入。

我正在.NET Core上的C#中执行此操作。

如何排除注释内的示例import语句?

这目前不包括动态import语句,它可能应该包含,但由于它们没有显式别名,因此最好单独使用。

是否有更好的方法来处理.NET中的替换?

1 个答案:

答案 0 :(得分:1)

我建议使用以下正则表达式:

(?<key>import|export)\s+(?:(?<alias>[\w,{}\s\*]+)\s+from)?\s*(?:(["'])?(?<ref>[@\w\s\\\/.-]+)\3?)\s*;
  • 别名部分包含一些不必要的字符,因为\s速记字符已经包含\r\n\t, 和
  • 不需要转义字符类中的所有特殊字符,例如-ref捕获组中的最后一个项目。

  • 我们可以使用反向引用来确保可选的结束报价与开始报价的类型相同。

  • 最后,我添加了分号作为结尾锚。这应该可以解决注释中的导入问题。

Demo