寻求可处理内部递归的更优正则表达式: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
相关产品推荐
相关产品推荐

