[英]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.