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
循环中应该是可行的,该循环在未检测到任何变化时立即退出。
我正在尝试将 [[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
循环中应该是可行的,该循环在未检测到任何变化时立即退出。