用于匹配 JS import 语句的正则表达式

jer*_*u15 7 javascript regex node.js

我正在使用节点来读取文件的内容。我需要匹配一个特定的导入语句,其中文件看起来像这样。

我只需要匹配包含“foo-bar”包的一行或多行。我有兴趣从该包中导入。

import React, { Component } from 'react'
import { withRouter } from 'react-router-dom'
import { connect } from 'react-redux'
import { foo, bar, fooBar } from 'foo-bar'
import { anotherThing } from 'another-module'
Run Code Online (Sandbox Code Playgroud)

它也可以像这样跨越多行。

import React, { Component } from 'react'
import { withRouter } from 'react-router-dom'
import { connect } from 'react-redux'
import { 
    foo, 
    bar, 
    fooBar 
} from 'foo-bar'
import { anotherThing } from 'another-module'
Run Code Online (Sandbox Code Playgroud)

我尝试过使用这个正则表达式,但它匹配从“import”到包含 foo-bar 的行末尾的所有行。我只想将导入匹配到以“foo-bar”结尾的行的末尾。使用 JavaScript 正则表达式可以实现这一点吗?另外,如果除了使用正则表达式之外还有更好的方法,我也愿意接受其他选项

import([\s\S]*?)(?=foo-bar').*
Run Code Online (Sandbox Code Playgroud)

单行示例: https: //regex101.com/r/U1j2G6/1

多行示例: https: //regex101.com/r/kcA7gd/1

Ant*_*aev 6

更新:正如 @jhm2k 在下面的答案中指出的那样,以下正则表达式存在多个问题。阅读本文的人应该检查他的答案或我在 github 中所做的重制


我开发了这个正则表达式,它可以匹配任何可以作为有效导入语句的内容:

导入([\n\t]*(?:[^\n\t\{\}]+[\n\t]*,?)?(?:[\n\t]*\{(?: [ \n\t]*[^ \n\t"'\{\}]+[ \n\t]*,?)+\})?[ \n\t]*) 来自[ \n\t ]*(['"])([^'"\n]+)(?:['"])

它具有以下捕获组:

  • $1导入变量
  • 用于导入的2 美元报价
  • $3导入路径

对于您的情况,您可以测试 3 美元。

使用它时要小心,因为它也匹配字符串内的出现。另外,我不会盲目使用它,可能会有错误并且速度很慢。

我使用以下文件进行测试:

import someClass from "src"
import someClass from"src"
import
someClass
from
"src"
import someClass
from       "src"

import {class1,class2} from "src"
import {
    class1,
    class2
            } from"src"

    import {
        class1

                } from "src"

import defaultClass   ,

{
    class1
}

  from "src"

import defaultClass,

{
    class1
}from "src"

import someClass from "src";import someClass from "src"


"I disagree about your import practices from 'src/who knows where'"
`import someClass from "src"
import someClass from"src"
import
someClass
from
"src"
import someClass
from       "src"

import {class1, class2} from "src"
import {
    class1,
    class2
            } from"src"

    import {
        class1

                } from "src"

import defaultClass   ,

{
    class1
}

  from "src"

import defaultClass,

{
    class1
}from "src"
`
Run Code Online (Sandbox Code Playgroud)


Add*_*son 3

我通过使用负捕获组解决了您遇到的问题 - 它将匹配尽可能多的字符,最多}.

这是正则表达式。

import {[^}]*}.*'foo-bar'
Run Code Online (Sandbox Code Playgroud)

在线尝试一下!