首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift中的反斜杠

Swift中的反斜杠
EN

Stack Overflow用户
提问于 2016-09-14 10:45:31
回答 4查看 10.3K关注 0票数 6

我想取消转义反斜杠在用户输入字符串,以使用他们的regex替换。

转义反斜杠很容易用NSRegularExpression.escapedTemplate(for: "\\n")完成。这将像预期的那样返回"\\\\n"。但是,我如何向后转换它们,例如\\n (反斜杠+ n)到\n (返回)?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-14 11:30:50

但是,我认为不可能自动这样做,因为Swift中只有几个转义字符,您可以将它们放入数组中,循环它们,然后用未转义的版本替换所有实例。下面是我做的一个字符串扩展,它可以这样做:

代码语言:javascript
复制
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
    }
}

要使用它,只需访问该属性。例如,

代码语言:javascript
复制
print("Hello,\\nWorld!".unescaped) 

将打印

代码语言:javascript
复制
Hello,
World!
票数 13
EN

Stack Overflow用户

发布于 2016-09-14 18:17:35

我改进了@kabiroberai的代码,使其更加实用,并删除了剩下的单个反斜杠。

代码语言:javascript
复制
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: "\\")
    }
}

更新

在某些情况下,我发现我以前的代码不能正确地转义。

所以我更新了我的制作代码。下面是我使用的最新版本。我不确定我真的需要做这个复杂的过程,但现在看来效果更好了。

代码语言:javascript
复制
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) }
        }
}
票数 2
EN

Stack Overflow用户

发布于 2021-03-26 14:06:24

这是我的逃避和未逃脱的字符串。

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39488488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档