How to replace `qux$foo$bar` with `qux[["foo"]][["bar]]`? (dollar subsetting to brackets subsetting)

How to replace `qux$foo$bar` with `qux[["foo"]][["bar]]`? (dollar subsetting to brackets subsetting)

在 R 脚本中(我会用 readLines 阅读),我想用 qux[["foo"]][["bar]] 替换每次出现的 qux$foo$bar。但我不是正则表达式大师。

我从这个正则表达式开始:

> gsub("(\w*)(\$)(\w*)", '\1[["\3"]]', "qux$foo$bar; input$test$a$a") %>% cat
qux[["foo"]][["bar"]]; input[["test"]][["a"]][["a"]]

不错。但我也想处理反引号的情况。所以我尝试了:

> gsub("(\w*)(\$)`{0,1}(\w*)`{0,1}", '\1[["\3"]]', "qux$`foo`; bar$`baz`; x$uvw") %>% cat
qux[["foo"]]; bar[["baz"]]; x[["uvw"]]

看起来正确。但是在反引号之间,可以有一个space,并且在这种情况下以前的方法不起作用。所以我尝试了以下方法,但都不起作用:

gsub("(\w*)(\$)`{0,1}(.*)`{0,1}", '\1[["\3"]]', "qux$`fo o`") %>% cat
qux[["fo o`"]]

你能帮忙找到正确的正则表达式模式吗?似乎我需要的不是 \w 而是 匹配“可以包含 spaces 的单词”.

您可以在匹配 1 个或多个单词字符前后重复可选空格。

您不需要 $ 的捕获组,但您可以使用捕获组来配对反引号,以防反引号存在或不存在,并使用对组 2 的反向引用。

要重复 0+ 个空白字符,您也可以使用 \s,但这也可以匹配换行符。

注意\w*匹配可选的字符,{0,1}可以写成?

(\w*)$(`?)( *\w+(?: +\w+)* *)

模式匹配:

  • (\w*)捕获第1组匹配可选单词字符
  • $ 匹配 $
  • (`?) 捕获 组 2,可选择匹配反引号
  • ( *\w+(?: +\w+)* *)捕获第3组匹配空格之间的单词字符重复
  • </code> 对第 2 组中捕获内容的反向引用(是或否反引号)</li> </ul> <p><a href="https://regex101.com/r/JDTYqR/1" rel="nofollow noreferrer">Regex demo</a></p> <pre><code>gsub("(\w*)\$(`?)( *\w+(?: +\w+)* *)\2", '\1[["\3"]]', "qux$fo o$bar", perl=TRUE)

    输出

    [1] "qux[[\"fo o\"]][[\"bar\"]]"
    

您可以使用

gsub('(\w*)(?|\$`([^`]*)`|\$([^\s$]+))', '\1[["\2"]]', x, perl=TRUE)
## Or
gsub('\$`([^`]*)`|\$([^\s$]+)', '[["\1\2"]]', x, perl=TRUE)

regex #1 demo and regex #2 demo详情:

  • (\w*) - 第 1 组 (</code>):零个或多个单词字符</li> <li><code>(?|$`([^`]*)`|$([^\s$]+)) - 分支重置组匹配
    • $`([^`]*)` - $、反引号、第 2 组 (</code>) 捕获零个或多个非反引号字符和反引号。</li> <li><code>| - 或
    • $([^\s$]+) - $,然后第 2 组 (</code>) 捕获除空格和 <code>$
    • 以外的一个或多个字符

the R demo:

x <- c('qux$foo$bar','qux$foo$bar; input$test$a$a','qux$`foo`; bar$`baz`; x$uvw','qux$`fo o`', 'q_ux$f_o_o$b.a_r')
gsub('(\w*)(?|\$`([^`]*)`|\$([^\s$]+))', '\1[["\2"]]', x, perl=TRUE)
## Or
## gsub('\$`([^`]*)`|\$([^\s$]+)', '[["\1\2"]]', x, perl=TRUE)

输出:

[1] "qux[[\"foo\"]][[\"bar\"]]"                                     
[2] "qux[[\"foo\"]][[\"bar;\"]] input[[\"test\"]][[\"a\"]][[\"a\"]]"
[3] "qux[[\"foo\"]]; bar[[\"baz\"]]; x[[\"uvw\"]]"                  
[4] "qux[[\"fo o\"]]"                                               
[5] "q_ux[[\"f_o_o\"]][[\"b.a_r\"]]"  

注意:输出中的反斜杠是控制台工件,用于使双引号字符串保持有效的字符串文字,它们不是纯文本输出的一部分。