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>$
以外的一个或多个字符
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\"]]"
注意:输出中的反斜杠是控制台工件,用于使双引号字符串保持有效的字符串文字,它们不是纯文本输出的一部分。
在 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>$
以外的一个或多个字符
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\"]]"
注意:输出中的反斜杠是控制台工件,用于使双引号字符串保持有效的字符串文字,它们不是纯文本输出的一部分。