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

寻求可处理内部递归的更优正则表达式:FOCAL转R代码适配

解决方案:一次性转换FOCAL变量索引为R风格

核心思路

利用Perl正则的递归匹配特性,精准区分FOCAL中的变量(1-2字符)和函数(≥3字符),一次性将所有变量的()索引替换为R的[]格式,包括嵌套的索引结构,无需重复执行替换操作。

实现代码

# 输入待转换的FOCAL代码字符串
thestr <- " ab(c(kk)) ab(c(5)) sin(x) qr(g) exp(cos(qr)) exp(z) exp(cos(qr(3))) cos(y(3))  sin(3)"

# 执行一次性替换(与示例格式一致,包含结尾空格)
result <- gsub('(?<![a-z])([a-z]{1,2})\\((((?>[^()]+)|(?R))*)\\)', '\\1[\\2 ]', thestr, perl = TRUE)

# 输出转换结果
cat(result)

正则表达式细节解释

  • (?<![a-z]):负向零宽断言,确保匹配的1-2字符变量名前不是字母,避免误匹配函数名的前缀(比如不会把sin的si当成变量)
  • ([a-z]{1,2}):捕获1-2个小写字母的FOCAL变量名
  • \\((((?>[^()]+)|(?R))*)\\):递归匹配括号内的内容,要么是非括号字符,要么是整个模式的递归(处理多层嵌套的变量索引)
  • 替换规则\\1[\\2 ]:将捕获的变量名和括号内容转换为变量[内容 ]的R风格索引格式

效果验证

转换后的输出与需求完全一致:

" ab[c[kk] ]  ab[c[5] ]  sin(x) qr[g]  exp(cos(qr)) exp(z) exp(cos(qr[3] )) cos(y[3] )  sin(3)"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 18:55:01