我想取消转义反斜杠在用户输入字符串,以使用他们的regex替换。
转义反斜杠很容易用NSRegularExpression.escapedTemplate(for: "\\n")完成。这将像预期的那样返回"\\\\n"。但是,我如何向后转换它们,例如\\n (反斜杠+ n)到\n (返回)?
发布于 2016-09-14 11:30:50
但是,我认为不可能自动这样做,因为Swift中只有几个转义字符,您可以将它们放入数组中,循环它们,然后用未转义的版本替换所有实例。下面是我做的一个字符串扩展,它可以这样做:
extension String {
var unescaped: String {
let entities = ["\0", "\t", "\n", "\r", "\"", "\'", "\\"]
var current = self
for entity in entities {
let descriptionCharacters = entity.debugDescription.characters.dropFirst().dropLast()
let description = String(descriptionCharacters)
current = current.replacingOccurrences(of: description, with: entity)
}
return current
}
}要使用它,只需访问该属性。例如,
print("Hello,\\nWorld!".unescaped) 将打印
Hello,
World!发布于 2016-09-14 18:17:35
我改进了@kabiroberai的代码,使其更加实用,并删除了剩下的单个反斜杠。
extension String {
var unescaped: String {
let entities = ["\0": "\\0",
"\t": "\\t",
"\n": "\\n",
"\r": "\\r",
"\"": "\\\"",
"\'": "\\'",
]
return entities
.reduce(self) { (string, entity) in
string.replacingOccurrences(of: entity.value, with: entity.key)
}
.replacingOccurrences(of: "\\\\(?!\\\\)", with: "", options: .regularExpression)
.replacingOccurrences(of: "\\\\", with: "\\")
}
}更新
在某些情况下,我发现我以前的代码不能正确地转义。
所以我更新了我的制作代码。下面是我使用的最新版本。我不确定我真的需要做这个复杂的过程,但现在看来效果更好了。
var unescaped: String {
let entities = ["\0": "0",
"\t": "t",
"\n": "n",
"\r": "r",
"\"": "\"",
"\'": "'",
]
return entities
.mapValues { try! NSRegularExpression(pattern: "(?<!\\\\)(?:\\\\\\\\)*(\\\\" + $0 + ")") }
.reduce(self) { (string, entity) in
entity.value.matches(in: string, range: string.nsRange)
.map { $0.range(at: 1) }
.reversed()
.reduce(string) { ($0 as NSString).replacingCharacters(in: $1, with: entity.key) }
}
}发布于 2021-03-26 14:06:24
这是我的逃避和未逃脱的字符串。
let given = "{\n\t\"test\": \"this \\ \",\n\r\t\"\'testing\': 1\r\n}\\ \0 \\"
let expected = #"{\n\t\"test\": \"this \\ \",\n\r\t\"\'testing\': 1\r\n}\\ \0 \\"#
let expectedAscii = #"{\n\t\"test\": \"this \u{0001F603} \\ \",\n\r\t\"\'testing\': 1\r\n}\\ \0 \\"#
extension String {
private static let escapedChars = [
(#"\0"#, "\0"),
(#"\t"#, "\t"),
(#"\n"#, "\n"),
(#"\r"#, "\r"),
(#"\""#, "\""),
(#"\'"#, "\'"),
(#"\\"#, "\\")
]
var escaped: String {
self.unicodeScalars.map { $0.escaped(asASCII: false) }.joined()
}
var asciiEscaped: String {
self.unicodeScalars.map { $0.escaped(asASCII: true) }.joined()
}
var unescaped: String {
var result: String = self
String.escapedChars.forEach {
result = result.replacingOccurrences(of: $0.0, with: $0.1)
}
return result
}
}
print(expected == given.escaped)
print(expectedAscii == given.asciiEscaped)
print(given.escaped.unescaped == given)
print(expected.unescaped == given)
print(expected.unescaped.escaped == expected)https://stackoverflow.com/questions/39488488
复制相似问题