【问题标题】:Swift - Splitting strings with regex - ignoring search stringSwift - 使用正则表达式拆分字符串 - 忽略搜索字符串
【发布时间】:2019-04-13 18:18:08
【问题描述】:

这里给出了一个聪明的第一个答案,用于使用正则表达式拆分 swift 字符串

split string answer

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

例如:正则表达式类似于

"\\\||Z|ZY"

当应用于"hi|thisZshouldZYbe|separated" 的字符串时,你会得到一个数组

["hi", "this", "should", "be", "separated"]

注意。正则表达式适用于带有双重转义的 swift NSRegularExpression 格式。在常规正则表达式中,它只是 "\||Z|ZY" 另外请注意,正则表达式包含垂直线符号而不是字母“l”

你可能不需要对原件做太多的调整来工作。

【问题讨论】:

    标签: regex swift4 nsregularexpression


    【解决方案1】:

    你可以像这样定义一个扩展:

    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" 时,上述代码无法按预期工作,但我认为您可以修改您的模式以适应此扩展。

    【讨论】:

    • 谢谢。我想我可以遵循您在代码中所做的事情 - 并且是有道理的。非常简洁!而且我没有意识到您可以在退货声明中使用这样的地图-非常感谢。正是这种 NSRange 和正常范围之间的转换使它变得如此棘手。一旦纠正了其他一些错误,我需要进行测试。
    • 我已经对此进行了测试,它对我的​​目的运行良好。谢谢
    【解决方案2】:

    我的建议是创建一个 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 是的,为什么不呢? ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多