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

时间:2018-04-03 09:51:09

标签: r regex gsub brackets curly-braces

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

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

  2. 此外,我想在{之后的第一个\calculus{.+}及其对应的大括号}之间捕捉字符串。

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

    以下内容捕捉到最后一个大括号的所有内容。

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

1 个答案:

答案 0 :(得分:1)

对于第二项任务,您可以结合基座regmatches()中的gregexpr()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