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

时间:2018-11-10 10:58:28

标签: regex swift4 nsregularexpression

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

split string answer

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

例如:regex类似于

"\\\||Z|ZY"

,当应用于"hi|thisZshouldZYbe|separated"的字符串时,您将获得一个数组

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

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

您可能不需要对原始内容进行过多的调整即可完成工作。

2 个答案:

答案 0 :(得分:4)

您可以这样定义扩展名:

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"时无法正常工作,但是我认为您可以修改模式以适合此扩展名。

答案 1 :(得分:0)

我的建议是创建一个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"

工作