let string1 = "foo\\bar"
print(string1) // this will print "foo\bar"
print(string1.count) // this will print "7", not "8"
let string2 = string1.replacing("\\", with: "")
print(string2) // this will print "foobar"
print(string2.count) // this will print "6"
6条答案
按热度按时间jecbmhm31#
你可以只替换这些反斜杠,例如:
字符串
或者,为了避免普通字符串字面量中的反斜杠被另一个反斜杠转义的事实,我们可以使用
#"
和"#
的扩展字符串:型
但是,如果可能的话,你真的应该修复那个返回这些反斜杠的API,因为这显然是不正确的。这段代码的作者显然错误地认为必须转义正斜杠,但这不是真的。
总之,API应该被修复为不插入这些反斜杠,但是在修复之前,您可以使用上面的方法来删除可能出现的任何反斜杠。
在下面评论的讨论中,似乎对字符串中的反斜杠有很大的困惑。所以,让我们退后一步,讨论一下"字符串字面量"。正如文档所说,字符串字面量是:
您可以在代码中包含预定义的
String
值作为字符串字面量。字符串字面量是由一对双引号(""
)包围的文本字符的固定序列。注意,字符串字面量只是代码中特定的固定字符序列的表示。但是,这不应该与基础
String
对象本身混淆。字符串字面量和基础String
对象之间的关键区别在于,字符串字面量允许使用反斜杠作为"转义"字符,在表示特殊字符(或进行字符串插值)时使用。正如文档所述:字符串文字可以包含以下特殊字符:
\0
(空字符)、\\
(反斜杠)、\t
(水平制表符)、\n
(换行符)、\r
(回车符)、\"
(双引号)和\'
(单引号)\u{n}
,其中n
是1 - 8位十六进制数,其值等于有效的Unicode码位所以,你是正确的,在一个字符串字面量中,正如你上面引用的摘录所指出的,你不能有一个未转义的反斜杠。因此,每当你想在一个字符串字面量中表示一个反斜杠时,你就用
\\
来表示。因此,上面的
replacing
意味着“查看string1
,找到所有出现的单个反斜杠,并将其替换为空字符串(即删除反斜杠)。请考虑:
型
有点令人困惑的是,如果您在"变量"面板的"变量"视图中或在playground中查看
string1
,它将显示一个字符串文字表示(即反斜杠将显示为"\\"
)。但是不要混淆。当你在字符串字面量中看到\\
时,在实际的字符串中实际上只有一个反斜杠。但是如果你print
这个值或者看实际的字符,在字符串中只有一个反斜杠,它本身。简而言之,不要混淆字符串字面量中的反斜杠转义(例如,
replacing
的参数)和基础字符串中存在的单个反斜杠。6mw9ycah2#
我发现我在尝试将对象编码为JSON时遇到了同样的问题。根据您是否使用较新的
JSONEncoder
类来解析JSON,并且您至少支持iOS 13,您可以使用.withoutEscapingSlashes
输出格式:字符串
8zzbczxx3#
请检查下面的代码。
字符串
14ifxucb4#
我用这段代码解决了:
字符串
czfnxgou5#
通过添加额外的反斜杠在字符串中包含反斜杠。
yjghlzjz6#
要删除单个反斜杠,请尝试以下操作
字符串