regex 在子集调用中编辑索引范围的有效方法

szqfcxe2  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(119)

将代码从索引以0开头的语言移植到索引以1开头的语言的问题一直存在,在这种情况下,我想移植一个长块,如下所示

x[0:3] =  c(65,43, 22)
x[4:7] = c(23, 17,93, 7)

我对正则表达式相当熟悉,所以我可以生成一个模式
例如,搜索“[[0:9]{1,}:“等,但我不想提取每个数字序列,转换为数字,加一,然后paste0所有这些都在一起。
有没有更好的方法,或者说,有没有一个现有的R包可以自动“移动”文本字符串中的所有索引?
跟进:是的,我可以将这个文件转储到源语言中,创建x,打印x值,然后将其馈送到R,但我宁愿不这样做。

vsikbqxv

vsikbqxv1#

如果你的输入真的像这样

input <- "x[0..3] = {65, 34, 22}
x[4..7] = {23, 17, 93, 7}"

然后,您可以使用str_replace_all来帮助进行转换。

library(stringr)
output <- str_replace_all(input, pattern=r"((\w+\[)(\d+)\.\.(\d+)\])", replacement=function(x) {
  m <- str_match(x, r"((\w+\[)(\d+)\.\.(\d+)\])")
  paste0(m[,2], as.numeric(m[,3])+1, ":", as.numeric(m[,4])+1, "]")
})
output <- str_replace_all(output, pattern=r"((\{)([^\}]+)(\}))", replacement="c(\\2)")
cat(output)
# x[1:4] = c(65, 34, 22)
# x[5:8] = c(23, 17, 93, 7)

它使用一个转换函数来增加匹配中索引的值。

相关问题