R:在存在多个括号时替换内部方括号

R: replace interior square brackets in presence of multiple brackets

我正在尝试将 [[a], [b]] 等表达式转换为 list(c(a), c(b))(基本上是将 java 字典转换为 R 列表)。作为第一步,我想将每个内部表达式 [a] 转换为等效的 c(a)。根据 ,我可以使用一个很好的正则表达式 "\[(.*?)\]" 或者 \[([^]]*)\].

当只有一个 [] 括号时,这将起作用,但不会像 [[ 这样的多个括号,因为它将捕获第一个,导致 "c([a), c(b])" 而不是 "[c(a), c(b)]".如何确保我只匹配包含多个 [[], []]?

的调用中的内括号
vec <- c("[a]", "[[a], [b]]")
gsub("\[(.*?)\]", "c(\1)", vec)
#> [1] "c(a)"         "c([a), c(b])"
gsub("\[([^]]*)\]", "c(\1)", vec)
#> [1] "c(a)"         "c([a), c(b)]"

reprex package (v0.3.0)

于 2021-02-15 创建

虽然 建议如何处理正则表达式本身,但它没有解决问题的“嵌套”部分。

您可以 运行 多次,直到没有更多变化为止。

vec <- c("[a]", "[[a], [b]]")
(vec2 <- gsub("\[([^][]*)\]", "c(\1)", vec))
# [1] "c(a)"         "[c(a), c(b)]"
(vec3 <- gsub("\[([^][]*)\]", "c(\1)", vec2))
# [1] "c(a)"          "c(c(a), c(b))"

更改是不允许在正则表达式中打开 [ 和关闭 ] 括号,这应该只匹配最里面的(没有括号)。

将其嵌套在一个 while 循环中应该是可行的,该循环在未检测到任何变化时立即退出。