R 正则表达式分解字符串中的参数列表(来自其他语言)

R regex that decompose a list of arguments (from an other language) in a string

我正在寻找一个正则表达式来分解一个字符串,该字符串包含以另一种语言编写的函数的参数,列表形式为 argName = value.

我的参数字符串的一个实例是:

args <- "arg1, arg2 = {{space}}, arg3 = TRUE, arg4 = {{plot, datG1, arg1 = TRUE}}, arg5 = ga, arg6 = {{bla bla {{plot, datG1, arg1 = TRUE}}}}"

其中 arg1 是一个没有值的参数(按照惯例,这里是 value = NA),arg2 取值 "{{space}}"arg3"TRUE",等等

每个值都应作为字符串返回(或 NA)。特殊形式 {{foo}} 是函数(如 {{space}} 中)或最终包含函数的文本(如 {{bla bla {{plot, datG1, arg1 = TRUE}}}} 中)的约定。我已经有一个代码识别功能和纯文本。我唯一需要的是列出每个函数的参数。

所以在这里,正则表达式应该允许我分解列表中的字符串 args

list(
  arg1 = NA,
  arg2 = "{{space}}", 
  arg3 = "TRUE", 
  arg4 = "{{plot, datG1, arg1 = TRUE}}",
  arg5 = "ga",
  arg6 = "{{bla bla {{plot, datG1, arg1 = TRUE}}}}"
)

我用来识别函数的正则表达式是"\{\{((?>[^\{\{\}\}]+|(?R))*)\}\}"

您可以使用

args <- "arg1, arg2 = {{space}}, arg3 = TRUE, arg4 = {{plot, datG1, arg1 = TRUE}}, arg5 = ga, arg6 = {{bla bla {{plot, datG1, arg1 = TRUE}}}}"
rx <- "(\w+)(?:\s*=\s*((\{\{((?>(?!\{\{|}})(?s).|(?3))*)}})|\w+))?"
matches <- regmatches(args, gregexec(rx, args, perl=TRUE))
keys <- matches[[1]][2,]
values <- matches[[1]][3,]
values[values==""] <- NA
names(values) <- keys

regex demo。现在,values 将包含您的数据。您也可以将数据放入 df <- data.frame(params=matches[[1]][2,], values=matches[[1]][3,]).

的数据框中

详情:

  • (\w+) - 第 1 组:一个或多个单词字符
  • (?:\s*=\s*((\{\{((?>(?!\{\{|}})(?s).|(?2))*)}})|\w+))? - 一个可选的序列
    • \s*=\s* - 包含零个或多个空格的 = 字符
    • ((\{\{((?>(?!\{\{|}})(?s).|(?2))*)}})|\w+) - 第 2 组:
      • (\{\{((?>(?!\{\{|}})(?s).|(?2))*)}}) - 第 3 组(用于递归):a {{,然后是不以 {{ 或 [=21= 开头的任何字符的任何零次或多次重复] 字符序列(重复零次或多次),或第 3 组模式,然后是 }} 子字符串
      • | - 或
      • \w+ - 一个或多个单词字符。