You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言中使用递归正则匹配花括号内内容的实现方法

解决R语言中的正则匹配与替换需求

我来帮你搞定这个R语言里的正则问题,分两步实现你的需求:替换\calculus{fff}中的fff,以及捕获\calculus{.+}之后第一个配对大括号内的内容。

第一步:替换\calculus{}中的目标内容

首先,我们需要定位\calculus{}里的第一个大括号内容(也就是例子里的fff),并替换成你想要的新文本。这里用R的sub()函数就可以搞定,因为你的字符串里应该只有一个\calculus实例:

# 定义原字符串
x <- "sdfwervd \\calculus{fff}{\\trt{sdfsdf} &amp; \\trt{sdfsdf} &amp; \\trt{sdfsdf} \\{} sdfsdf &amp; sdfsdf &amp; sefgse3 } aserdd wersdf sewtgdf"

# 替换\calculus{fff}中的fff为"my_new_content"
x_replaced <- sub(
  pattern = "\\\\calculus\\{([^}]+)\\}",  # 匹配\calculus{...},捕获第一个大括号内的内容
  replacement = "\\\\calculus{my_new_content}",  # 替换成新内容
  x = x
)

# 查看替换后的结果
cat(x_replaced, "\n")

第二步:捕获\calculus之后的第一个配对大括号内容

接下来要捕获\calculus{...}之后的第一个配对大括号里的文本——这里要注意,大括号可能存在嵌套(比如例子里的\trt{sdfsdf}),所以需要用平衡括号正则来准确匹配。我们可以用stringr包的str_extract(),或者base R的regmatches(),配合Perl风格的递归正则:

方法1:使用stringr包(更简洁)

library(stringr)

# 捕获目标内容
captured_content <- str_extract(
  x,
  pattern = "\\\\calculus\\{[^}]+\\}\\K\\{(?:[^{}]+|(?R))*\\}",
  perl = TRUE
)

# 查看捕获结果
cat("捕获到的内容:", captured_content, "\n")

方法2:使用base R

# 使用regmatches和regexpr实现捕获
matches <- regmatches(
  x,
  regexpr("\\\\calculus\\{[^}]+\\}\\K\\{(?:[^{}]+|(?R))*\\}", x, perl = TRUE)
)

captured_content_base <- if(length(matches) > 0) matches else NA

# 查看结果
cat("捕获到的内容(base R):", captured_content_base, "\n")

正则解释

  • 替换用的正则\\\\calculus\\{([^}]+)\\}:

    • \\\\calculus匹配字符串里的\calculus(R里需要双重转义);
    • \\{([^}]+)\\}匹配第一个大括号,([^}]+)捕获里面的所有非}字符(也就是fff)。
  • 捕获用的正则\\\\calculus\\{[^}]+\\}\\K\\{(?:[^{}]+|(?R))*\\}:

    • \\\\calculus\\{[^}]+\\}先定位整个\calculus{fff}部分;
    • \\K丢弃前面匹配的内容,只保留后面的目标部分;
    • \\{(?:[^{}]+|(?R))*\\}是平衡括号匹配:[^{}]+匹配非括号字符,(?R)递归匹配整个括号结构,确保即使有嵌套的{}也能准确捕获到最外层的配对括号内容。

内容的提问来源于stack exchange,提问作者Crops

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:15:26