我在删除\n
和\r
标签时遇到问题。当我使用双引号时,它工作正常,否则它离开"\"
. 使用gsub
, 根本没有双引号就行不通。为什么?
"Remove \n".delete('\n') # result: "Remove"
'Remove \n'.delete('\n') # result: "Remove \"
我发现这是因为它不适用于数据库中的结果。
我在删除\n
和\r
标签时遇到问题。当我使用双引号时,它工作正常,否则它离开"\"
. 使用gsub
, 根本没有双引号就行不通。为什么?
"Remove \n".delete('\n') # result: "Remove"
'Remove \n'.delete('\n') # result: "Remove \"
我发现这是因为它不适用于数据库中的结果。
单引号字符串不处理大多数转义序列。所以,当你有这个
'\n'
它的字面意思是“两个字符串,其中第一个字符是反斜杠,第二个字符是小写的'n'”。它并不意味着“换行符”。为了\n
表示换行符,你必须把它放在双引号字符串中(它确实处理这个转义序列)。这里有一些例子:
"Remove \n".delete('\n') # => "Remove \n" # doesn't match
'Remove \n'.delete('\n') # => "Remove \\" # see below
'Remove \n'.delete("\n") # => "Remove \\n" # no newline in source string
"Remove \n".delete("\n") # => "Remove " # properly removed
请注意delete
,由于方法中的特殊逻辑,此特定示例中的反斜杠字符(第二行,在调用中使用单引号字符串)被简单地忽略delete
。有关更多信息,请参阅String#count上的文档。要绕过这个,gsub
例如使用
'Remove \n'.gsub('\n', '') # => "Remove "
单引号仅支持两个转义序列。
\' – single quote \\ – single backslash
除了这两个转义序列外,单引号之间的其他所有内容都按字面意思处理。
因此,如果您输入\n
irb,您将返回\\n
.
这就是为什么你有问题delete
"Remove \n".delete('\n') #=> "Remove \n".delete("\\n") => "Remove \n"
'Remove \n'.delete('\n') #=> "Remove \\n".delete("\\n") => "Remove \\"
如果您不关心额外的空格,最干净的解决方案是使用#strip:
"Remove \n".strip