如何让我的正则表达式捕获大括号对并在大括号对后停止匹配

How do I get my Regex to capture pairs of curly braces and stop matching after the pair

提问人:Dylan Spies 提问时间:10/19/2023 最后编辑:InSyncDylan Spies 更新时间:10/19/2023 访问量:39

问:

假设我们正在查看一些文本,如下所示

type vehicle = {
    type: 'car' | 'truck',
    cylinders: number,
    options: string[],
    trim: {
        upholstery: string,
        exteriorColor: string,
        gearbox: string
    }
}

export {
    vehicle
}

我想捕获“type vehicle = {.....}”所以比赛将是

type vehicle = {
    type: 'car' | 'truck',
    cylinders: number,
    options: string[],
    trim: {
        upholstery: string,
        exteriorColor: string,
        gearbox: string
    }
}

我正在使用这个正则表达式。/type\s*[a-zA-z0-]+\s*=\s*{[\s\S]*}/g

希望它能捕捉到 .好吧,它做得太好了,所以只要以“type name =”开头的东西,它就会继续捕获,并且它可以找到一对大括号。因此,导出语句也被捕获。type name = {}

我还尝试过使用 /u 进行不贪婪,但无法捕获对象的最后一个大括号。

我相信这部分是问题所在,但我很难找到解决方案{[\s\S]*}

JavaScript 正则表达式 Lookarounds

评论

2赞 InSync 10/19/2023
如果要解析 TS,请使用解析器。正则表达式不是一个合适的工具,尤其是在我们没有递归平衡组的 JS 中。
0赞 Alex Wayne 10/19/2023
你不能用正则表达式来解析它,就像你不能用正则表达式来解析html一样。
0赞 sln 10/20/2023
您需要使用一个执行平衡文本的正则表达式引擎,例如 Pcre、Perl、C# 等。

答:

-1赞 DuesserBaest 10/19/2023 #1

如果 JSON 中始终具有这种确切的格式,则可以使用:

^type[\s\S]+?^}

在行的开头从 up 到 a 匹配。type}

请参见:https://regex101.com/r/vmJs4B/latest

但是,我同意您问题的评论者的观点,即为了普遍解决这个问题,正则表达式不是合适的工具。