【问题标题】:How to replace "&" with "\&"如何用“\&”替换“&”
【发布时间】:2020-05-21 17:11:34
【问题描述】:

我发现使用 R 的 base gsub() 函数很难将 "&" 替换为 "\&" -

gsub("&", "\&", "A&B")

给出以下错误 -

Error: '\&' is an unrecognized escape in character string starting ""\&"

有没有办法实现这种替换?

【问题讨论】:

  • gsub("&", "\\&", "A&B",fixed=TRUE)
  • 有了这个我得到“A\\&B”。我想得到“A\&B”(单转)
  • 不,你得到了A\&B,你只能在控制台中看到双\。试试cat(...)
  • 关于 R 字符串文字中的反斜杠的另一个答案 - Escaping \ in string or paths in R

标签: r regex gsub


【解决方案1】:

你可以使用

gsub("&", "\\&", "A&B",fixed=TRUE) # Fixed string replacement
gsub("(&)", "\\\\\\1", "A&B")      # Regex replacement

固定字符串替换很明确:每个& 都替换为\&。双精度 \ 在字符串文字中用于表示文字 \

在正则表达式替换中,& 匹配并被捕获到第 1 组。由于反斜杠是正则表达式替换模式中的特殊字符,所以它必须加倍,并且 - 请记住,文字反斜杠是用 @ 定义的字符串文字中的 987654330@ - 我们需要在替换中使用 \\\\\1 是对第 1 组值的反向引用,但同样,\ 必须在字符串文字中加倍,因此,我们在其中使用 \\1。这就是为什么连续有 6 个反斜杠。您可能会发现更多关于反斜杠问题here

结果只包含一个反斜杠,您可以使用cat 或将内容保存到文本文件轻松检查:

cat(gsub("&", "\\&", "A&B",fixed=TRUE), collapse="\n")
cat(gsub("(&)", "\\\\\\1", "A&B"))

R demo online

【讨论】:

  • 但是如果我将此结果传递给另一个变量,那么新变量仍然包含双转义。这令人厌恶的混乱
  • @Bogaso 请参阅hereDOES NOT 包含任何双反斜杠。 期间.
  • @Bogaso, function cat 按原样显示字符串,不加倍反斜杠。试试cat(gsub("&", "\\&", "A&B",fixed=TRUE)),它会显示A\&B
猜你喜欢
  • 1970-01-01
  • 2014-12-17
  • 2020-12-30
  • 1970-01-01
  • 2022-12-01
  • 2013-04-30
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多