繁体   English   中英

正则表达式获取大括号之间的文本

[英]Regex to get text beween curly brackets

我有某种这种文件

...some other block above also with a { block }

Main:   Subroutine( )
{ <--
    Include(foo = bar )
    Call(foo = bar )
    Repeat(foo = ibar )
    {
        Message("Message = bar number {ibar}" foo )
        Something( )
        Message("Message = foo {bar}" )
    }
    Message("Message = again  {iterations}" )
    For(start = foo , end = bar  )
    {
        Comment( )
    }
    While(foo )
    {
        Comment( )
    }
    Comment( )
} <--
... some other block below also with a { block }

我需要匹配标有 <-- 的父括号之间的所有内容,我想出了这个

/^Main:\s*\w*\(\s*\)\s*\{\s*((?:.*\s*)*?)\}$/gm

但它在第一个嵌套块的 } 之后停止,我不知道如何到达最后一个括号。

有什么方法可以匹配直到新行前面的大括号?

谢谢!

编辑:也许我应该补充一下,n 嵌套 { } 块是可能的

许多正则表达式实现不允许用户递归匹配嵌套组。 Javascript 不提供 PCRE 递归参数(?R) ,请参见此处

改为编写一个小型解析器。

如果要获取大括号之间的内容,是否可以使用split方法:

 const str = `Main: Subroutine( ) { Include(foo = bar ) Call(foo = bar ) Repeat(foo = ibar ) { Message("Message = bar number {ibar}" foo ) Something( ) Message("Message = foo {bar}" ) } Message("Message = again {iterations}" ) For(start = foo, end = bar ) { Comment( ) } While(foo ) { Comment( ) } Comment( ) } ` const result = str.split(/[{}]+/) console.log(result);

更新 1:

我添加了一些数据以使示例数据更加复杂。

您可以找到所需单词的起始索引,然后制作 substring 以提取必要的数据:

 const str = `Main 1 Main: Subroutine( ) { Include(foo = bar ) Call(foo = bar ) Repeat(foo = ibar ) { Message("Message = bar number {ibar}" foo ) Something( ) Message("Message = foo {bar}" ) } Message("Message = again {iterations}" ) For(start = foo, end = bar ) { Comment( ) } While(foo ) { Comment( ) } Comment( ) } ` const strToFind = `Main: Subroutine( )`; const preparedString = str.substring(str.indexOf(strToFind)); const result = preparedString.split(/[{}]+/) console.log(result);

嵌套构造对于正则表达式来说是一种痛苦,通常最好使用或构建一些解析器来继续执行此类任务。

话虽如此,这里的情况看起来很简单,可以与一些简单的正则表达式匹配。

我将使用类似^Main:\s*\w*\(\s*\)\s*\{ <--[^}]*(?:\}(?! <--)[^}]*)*\} <--$ .

关键点:

  • \{ <--匹配一个左大括号,后跟所需的标记。
  • [^}]*匹配任何非闭合花括号。
  • (?:开始非捕获匹配,
    • \}一个右花括号,
    • (?! <--)后面没有标记,
    • [^}]*)继续匹配任何非闭合花括号。
  • \} <--最后匹配标记的右花括号。

尝试这个:

var myString = "Message = {foo} number {bar}"
var reg = /(?<=\{)\w*(?=\})/g
var myArray = [...myString.matchAll(reg)]
console.log(myArray)
// [['foo'],[bar]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM