【问题标题】:Recursive regex in R for curly bracesR中用于花括号的递归正则表达式
【发布时间】:2018-09-12 14:28:51
【问题描述】:

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

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

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

如何在 R 中使用正则表达式?

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

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

【问题讨论】:

  • 首先,x 字符串文字中的反斜杠必须加倍(但不确定 \\{}"\\{}" => \{})。那么c之前的反斜杠就可以匹配2个文字反斜杠,即字符串文字中的4个反斜杠。要匹配尽可能少的字符,请将.* 替换为.*?gsub 用一些替换替换匹配,您正在删除整个匹配,并且只删除匹配。
  • 可以试试 gsub("(\\calculus\\{)(.+)(\\})", "(\\calculus\\{)(###)(\ \})", x)

标签: r regex gsub brackets curly-braces


【解决方案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

【讨论】:

  • 如何单独从第二个模式中删除花括号并修改它? \\calculus{fff}{anystring}\\calculus{fff}##anystring$$ regex101.com/r/vduvHi/3
  • 使用substr(your_string, 1, nchar(your_string) - 1) 或捕获组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多