首页 > 解决方案 > 正则表达式 - 获取匹配大括号内的内容

问题描述

我有一个表格文本:

text <- "\\examples{afunction(x = list()){\nx<-3\n}y<-2 server <- function(input, output, session) {\n  output$res_bttn1 <- renderPrint({input$bttn1})\n}\n}"

我想获得\\examples{}\n最后没有)的内容,即

"afunction(x = list()){\nx<-3\n}y<-2 server <- function(input, output, session) {\n  output$res_bttn1 <- renderPrint({input$bttn1})\n}"

问题是里面还有其他大括号\\examples{}。因此,我认为我必须找到一个正则表达式来检测哪个}关闭\\examples{(但我对如何获得相同结果的其他建议持开放态度)。

我怎样才能做到这一点?优选碱R溶液。

标签: rregex

解决方案


您可以使用

\\examples({([^{}]*?(?:(?1)[^{}]*?)*)\s*})

请参阅正则表达式演示

细节

  • \\examples- 一个\examples字符串
  • ({([^{}]*?(?:(?1)[^{}]*?)*)\s*})- 第 1 组(这是必要的,因为正则表达式子例程(?1)将递归此子模式):
    • {- 一个{字符
    • ([^{}]*?(?:(?1)[^{}]*?)*)- 第 2 组(您需要的值):
      • [^{}]*?- 零个或多个字符{}尽可能少
      • (?:(?1)[^{}]*?)*- 整个第 1 组模式出现零次或多次,后跟零个或多个字符{}尽可能少
    • \s*- 零个或多个空格(修剪尾随之前的空格}
    • }- 一个}字符

请参阅R 演示

text <- "\\examples{afunction(x = list()){\nx<-3\n}y<-2 server <- function(input, output, session) {\n  output$res_bttn1 <- renderPrint({input$bttn1})\n}\n}"
pattern = "\\\\examples({([^{}]*?(?:(?1)[^{}]*?)*)\\s*})"
unlist(regmatches(text, regexec(pattern, text, perl=TRUE)))[3]
# => [1] "afunction(x = list()){\nx<-3\n}y<-2 server <- function(input, output, session) {\n  output$res_bttn1 <- renderPrint({input$bttn1})\n}"

推荐阅读