R中用于大括号的递归正则表达式

Recursive regex in R for curly braces

我有以下模式的一些文本字符串。

x = "sdfwervd \calculus{fff}{\trt{sdfsdf} & \trt{sdfsdf} & \trt{sdfsdf} \{} sdfsdf & sdfsdf & sefgse3 } aserdd wersdf sewtgdf"
  1. 我想用正则表达式捕获字符串\calculus{fff}中的文本"fff"并替换为其他内容

  2. 此外,我想捕获 \calculus{.+} 之后的第一个 { 和它对应的右大括号 }.

    [= 之间的字符串30=]

如何在 R 中使用正则表达式执行此操作?

以下捕获了最后一个大括号之前的所有内容。

gsub("(\calculus\{)(.+)(\})", "", x)

对于第二个任务,您可以使用递归方法结合 regmatches()gregexpr() in base R:

x <- c("sdfwervd \calculus{fff}{\trt{sdfsdf} & \trt{sdfsdf} & \trt{sdfsdf} \{} sdfsdf & sdfsdf & sefgse3 } aserdd wersdf sewtgdf")

pattern <- "\{(?:[^{}]*|(?R))*\}"
(result <- regmatches(x, gregexpr(pattern, x, perl = TRUE)))


这会产生一个找到的子匹配列表:

[[1]]
[1] "{fff}"                                                                          
[2] "{\trt{sdfsdf} & \trt{sdfsdf} & \trt{sdfsdf} \{} sdfsdf & sdfsdf & sefgse3 }"

a demo for the expression on regex101.com