我觉得你的这几个问题在R for data science第2版14.2章节 创建字符串 以及 15.4.1章节 转义字符 里基本全都能找到答案。
我们使用的是“字符串”,用它来表示“表达式”。“字符串”的内容里都是些基本的字符、符号,因此需要特殊的转义字符的形式,才能表达出丰富的“表达式”。
- 反斜杠由于有转义的特殊的含义,因此一个字面意义上的反斜线,需要用’\\‘这样的字符串来表示,你直接print出来的会是内部存储的字符串,但是可以用
stringr::str_view
来显示它真正的含义(表达式?)
library(stringr)
# 如果想在自己的代码中直接写出测试字符串,那么要用“\\”
tmp <- "这是一段伪造的字符:\\1. 测试一;\\2. 测试二;\\三. 测试三;\\四. 测试四"
print(tmp)
str_view(tmp) # 但是实际的含义其实是单个的反斜杠
- 明白了这一点之后,你就知道字面意义上的单个反斜杠(“表达式”中的单个反斜杠),需要在字符串中写作“\\”存储下来。但同时,你在向R以字符串的形式输入匹配特征时,由于反斜杠是一个转义字符,那么为了能“表达”两个字面意义上的反斜杠(我们需要匹配的特征是存储的字符串中的“\\”,它表达了这个存储的字符串在此处是一个字面意义上的反斜杠),每个反斜杠都需要再被转义,所以实际输入的字符串是“\\\\”,即四个反斜杠
str_replace_all(tmp, pattern = "\\\\", replacement = "") #将字符串含义中的单独反斜杠,全部“删去”,即替换为“”
gsub("\\\\", "", x = tmp) # gsub的使用也是同理的
当然,我这是从R中自己创建这个测试字符串,所以需要把单独的反斜杠修改成双反斜杠。但是你如果把原始的这个字符串保存为一个txt文件,再读取进R中,那么潜在保存的数据会自动是双反斜杠的。
# str_test.txt 文件中保存了一行文本:这是一段伪造的字符:\1. 测试一;\2. 测试二;\三. 测试三;\四. 测试四
tmp2 <- readLines(con = "str_test.txt")
print(tmp2)
关于raw string,R 4.0开始支持,在R for data science中也有提到一些例子
tricky <- r"(double_quote <- "\"" # or '"'
single_quote <- '\'' # or "'")"
str_view(tricky)
#> [1] │ double_quote <- "\"" # or '"'
#> │ single_quote <- '\'' # or "'"
最后回到你一开始的例子,如果一个R中的字符串,它print出来的是“x\ty\a”的话,其实的含义是x,制表符(\t),y和一个圆点(\a),这个可以用str_view
验证下。所以你的gsub('\\a', 'a', 'x\ty\a')
的含义并不是把a前面的反斜杠删掉了,而是将圆点替换为字符a。