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
更新:正如 @jhm2k 在下面的答案中指出的那样,以下正则表达式存在多个问题。阅读本文的人应该检查他的答案或我在 github 中所做的重制。
我开发了这个正则表达式,它可以匹配任何可以作为有效导入语句的内容:
导入([\n\t]*(?:[^\n\t\{\}]+[\n\t]*,?)?(?:[\n\t]*\{(?: [ \n\t]*[^ \n\t"'\{\}]+[ \n\t]*,?)+\})?[ \n\t]*) 来自[ \n\t ]*(['"])([^'"\n]+)(?:['"])
它具有以下捕获组:
对于您的情况,您可以测试 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)
我通过使用负捕获组解决了您遇到的问题 - 它将匹配尽可能多的字符,最多}.
这是正则表达式。
import {[^}]*}.*'foo-bar'
Run Code Online (Sandbox Code Playgroud)