Swift - 使用正则表达式分割字符串 - 忽略搜索字符串

4

这里有一个聪明的第一条答案,用正则表达式分割Swift字符串。

分割字符串答案

然而,它会将搜索到的文本保留在答案数组中。我正在尝试做类似的事情,但忽略作为分隔符的字符(例如,就像Swift split函数一样,但只使用正则表达式作为分隔符)。

例如:正则表达式可能是:

"\\\||Z|ZY"

当应用于字符串"hi|thisZshouldZYbe|separated"时,您将获得一个数组。
["hi", "this", "should", "be", "separated"]

注意:该正则表达式已经适配成双重转义的 swift NSRegularExpression 格式。在常规正则表达式中,它只是 "\||Z|ZY"。还要注意,该正则表达式包含竖线符号,而非字母“l”。

你可能不需要对原始正则表达式进行太多调整就可以使用。

2个回答

12

您可以像这样定义扩展:

extension String {
    func split(usingRegex pattern: String) -> [String] {
        //### Crashes when you pass invalid `pattern`
        let regex = try! NSRegularExpression(pattern: pattern)
        let matches = regex.matches(in: self, range: NSRange(0..<utf16.count))
        let ranges = [startIndex..<startIndex] + matches.map{Range($0.range, in: self)!} + [endIndex..<endIndex]
        return (0...matches.count).map {String(self[ranges[$0].upperBound..<ranges[$0+1].lowerBound])}
    }
}

let str = "hi|thisZshouldZYbe|separated"
let separator = "\\||ZY?"
let result = str.split(usingRegex: separator)
print(result) //->["hi", "this", "should", "be", "separated"]

当您使用"\\||Z|ZY"时,以上代码不会像您期望的那样工作,但我认为您可以修改您的模式以适应这个扩展。


谢谢。我认为我可以理解你在代码中所做的 - 很有道理。非常简洁!我没有意识到你可以在返回语句上使用map - 所以非常感谢。正是NSRanges和普通ranges之间的转换使得它变得如此棘手。我需要在纠正其他错误后进行测试。 - domc
我已经测试过这个,它符合我的需求并且运行良好。谢谢。 - domc

3

我的建议是创建一个UUID字符串作为分隔符,然后用这个UUID字符串替换正则表达式模式的出现位置,并拆分字符串。

let string = "hi|thisZshouldZYbe|separated"
let uuid = UUID().uuidString
let result = string.replacingOccurrences(of: "\\||ZY?", with: uuid, options: .regularExpression).components(separatedBy: uuid)

你的模式只适用于OR部分的另一种顺序("\\||ZY|Z")。

为什么在Swift中不使用UUID - rmaddy
@rmaddy 当然可以,为什么不呢? - vadian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接