我试图从字符串中删除反斜杠,但如果我用 print 打印出来,我得到正确的字符串,但如果我用 "po" 打印它,我得到相同的字符串

I'm trying to remove backslash from string but if I print out with print I get the correct string , but if I print it with "po" I get the same string

MyString = "CfegoAsZEM/sP\u{10}\u{10}}"
MyString.replacingOccurrences(of: "\"", with: "")

with print(MyString) 我得到了这个:"CfegoAsZEM/sP"(这就是我需要的) 使用 po MyString(在调试器上):"CfegoAsZEM/sP\u{10}\u{10}}"

\u{10}是换行符

也许更好的方法是 trim 字符串,它会删除字符串开头和结尾的所有空格和换行符

let myString = "CfegoAsZEM/sP\u{10}\u{10}"
let trimmedString = myString.trimmingCharacters(in: .whitespacesAndNewlines)

您的字符串不包含反斜杠字符。相反,\u{} 序列是引入 Unicode 字符的转义序列。这就是为什么您不能使用 replacingOccurrences.

删除它的原因

在这种情况下,正如 Vadian 指出的那样,它是“新行”字符 (0x10)。因为这是一个不可见的“白色 space”字符,所以当您 print 字符串时您看不到它,但是当您使用 po 时您会看到它。调试器向您显示不可打印字符的转义序列。如果 print(MyString.debugDescription)

,您也会看到序列

不幸的是,trimmingCharactersIn 函数似乎没有考虑 Unicode 序列。

我们可以使用filter函数来检查字符串中的每个字符。如果字符是 ASCII 且值大于 31(32 是 space 字符,ASCII 序列中的第一个“可打印”字符)我们可以包含它。我们还需要确保包含非 ASCII 值,以免去除可打印的 Unicode 字符(例如表情符号或非拉丁字符)。

let MyString = "CfegoAsZEM/sP\u{10}\u{13}$}\u{1F600}".filter { [=10=].asciiValue ?? 32 > 31 }
print(MyString.debugDescription)
print(MyString)

输出

"CfegoAsZEM/sP}"

CfegoAsZEM/sP}

asciiValue return 是可选的,如果字符不是纯 ASCII,则为 nil。在这种情况下,我对 return 32 使用了 nil-coalescing 运算符,以便不过滤该字符。

我修改了初始字符串以包含一些可打印的 Unicode 以证明它没有被过滤器删除。