用R中的双引号替换转义的双引号

时间:2011-01-15 00:15:36

标签: sql mysql regex r escaping

我正在使用RMySQL向SQL数据库编写一些HTML代码(但我想我的问题是一个普遍的R问题,而不是与SQL或RMySQL真正相关)。所以我正在尝试这样的事情:

con <- RMySQL(...) # some connection    
html <- "<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>"    
    query <- c('INSERT INTO table (htmlfield) VALUES (\"', html, '"') 
    dbSendQuery(con,paste(query, collapse = ""))

麻烦的是,R的粘贴将用单引号(即'“')中的双引号替换为转义序列\”,即:

> paste(query, collapse = "")
[1] "INSERT INTO table (htmlfield) VALUES (\"<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>\""

如果我将向量查询中的单引号更改为双引号,并将html中的单引号更改为双精度,则问题出现在字符串html的一侧,因为html中的双引号会被替换为逃脱序列。

处理转义字符替换的最简单方法是什么?

我尝试了gsub('\\\"','"',html)但没有达到预期的效果,并在Ignore escape characters (backslashes) in R strings帖子中提出了解决方案,但我无法使其发挥作用。

感谢您的关注,Philipp

3 个答案:

答案 0 :(得分:4)

我发现您在问题中包含的内容存在两个问题。第一个看起来像拼写错误。后:

html <- "<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>"   

你有:

query <- c('INSERT INTO table (htmlfield) VALUES (\"', html, '"')
                                                  ^^^^^^^^^^^^^^^

请注意,您要转义一个字符串而不是另一个字符串。你不需要逃避它们,但是如果你这样做并不重要。对于最后一个字符串,你也意味着'")',我怀疑,这是你得到的错误的真正来源。 paste而不是c在这里更有用。如果我将这些结合起来,我们得到:

query <- paste('INSERT INTO table (htmlfield) VALUES ("', html, '")', sep = "")

我们可以直接使用:

dbSendQuery(con, query)

第二个问题,也是许多人所做的问题,是将对象的打印表示与对象本身混淆。如果我们打印query,我们会看到:

> query
[1] "INSERT INTO table (htmlfield) VALUES (\"<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>\")"

字符串的打印表示始终用""双引号括起来,因此需要对内部"进行转义。你想看的是实际的字符串。我们可以使用catwriteLines执行此操作 - 我更喜欢后者,因为它会自动将"\n"添加到字符串的末尾:

> writeLines(query)
INSERT INTO table (htmlfield) VALUES ("<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>")

注意"现在如何转义。这是由数据库服务器执行的SQL。如果这是您的数据库的有效SQL,那么它将起作用。

答案 1 :(得分:3)

你忘了逃避字符串中的反斜杠(我想,大多数编程语言就是这种情况,不确定R是否也是如此)。

gsub("\\\"", "\"", html)

答案 2 :(得分:3)

尝试粘贴此查询:

query <- c('INSERT INTO table (htmlfield) VALUES (\'', html, '\'') 

唯一的变化是使用引号:\'而不是"

总的来说:

html <- "<div style='text-align: center; font-family: Arial;'><span style='font-size: 14pt;'>Some text without any tricky symbols.</span></div>"    
query <- c('INSERT INTO table (htmlfield) VALUES (\'', html, '\'')
dbSendQuery(con, paste(query, collapse = ""))

我希望它能正常工作!