【问题标题】:Regex for matching JS import statements匹配 JS 导入语句的正则表达式
【发布时间】:2018-08-29 21:55:54
【问题描述】:

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

我只需要匹配包含“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'

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

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'

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

import([\s\S]*?)(?=foo-bar').*

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

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

【问题讨论】:

标签: javascript node.js regex


【解决方案1】:

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

这是正则表达式。

import {[^}]*}.*'foo-bar'

Try it online!

【讨论】:

    【解决方案2】:

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

    import([ \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"
    `
    

    【讨论】:

    • 在 regex101.com 中产生灾难性的回溯错误
    • 除非您正在查看未经编辑的版本,否则它应该可以工作。 regex101.com/r/0s3fBy/1 (我第一次发帖时,我错过了必须对一些字符进行分隔才能正确查看的事实。)
    猜你喜欢
    • 2016-01-16
    • 2017-10-27
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    相关资源
    最近更新 更多