在R中对字符串进行清洗处理。

7
这与之前的问题有关,链接在这里:将\u转义的Unicode字符串转换为ASCII 我提出了一种解决方案,涉及eval(parse(text=x))。对于非R用户,这意味着按照文本字符串进行解析,然后进行评估。目的不是允许执行任意代码,而是取消转义的Unicode文本。因此,解决方案如下:
eval(parse(text=paste0("'", x, "'")))

虽然由于受限的目标,这应该是相当安全的,但我很想知道:为了保持安全需要多少净化处理?

最少,我认为任何嵌入式的单引号和双引号都必须被转义。例如,假设我们有

x <- "this is a '; print(dir()); 'string"

按照上述片段对 eval 进行求值会执行中间的代码。因此,我们必须对引号进行转义:

eval(parse(text=paste0("'",
                       gsub("'", "\\\\'", x),
                       "'")))

同样地,对于双引号也是如此。我认为未转义的 Unicode 等价物 \u0022 和 \u0027 不是问题,因为对于解析器来说,它们与普通的 " 和 ' 是相同的。
我是否漏掉了这种方法中的任何问题?

如果有一种不需要使用eval(也没有风险)的方式来解析转义字符串,那就太好了! - seancarmody
我想到了一种不需要使用eval的替代方案:https://dev59.com/4mMm5IYBdhLWcg3wO9Hy#17771985 - seancarmody
2个回答

5
this is a \'; print(dir()); 'string

被转义为:

'this is a \\'; print(dir()); 'string'

双斜杠会被视为字面上的反斜杠,引号是活动的,代码将被执行。

此外,我不知道R语言,但是使用原始控制字符(如换行符或无效转义)可能至少会导致崩溃。

eval一般都是一场赌博游戏。常规字符串处理(在字符串中搜索所需序列并替换它)是更好的方法,最好使用特定规范格式的现有库。例如,如果您有JSON,则使用JSON解析器。有许多可能使用\u转义的字符串文字格式,每种格式都有略微不同的规则,因此您需要正确选择确切的格式。


实际上,解析器会在该输入上产生错误,因此整个表达式(包括嵌入的代码)将永远不会被评估。但这也不是很好... - Hong Ooi

0

有一个shQuote函数可以为您工作:

eval(parse(text=shQuote(x)))
# [1] "this is a '; print(dir()); 'string"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接